Aber der Abschnitt hier lautet ja "Grundlagen c#", weshalb ist es dann anrüchig Grundlagenfragen zu stellen ?
Ich würde Linq und Lambda-Ausdrücke jetzt nicht unbedingt als Grundlagen ansehen wollen. Die setzen schon ein wenig Basiswissen über C# und .NET voraus.
Was den eigentlichen Code angeht. Einfache englisch-Kenntnisse reichen hier doch um zumindest erkennen zu können, was passiert. Man muss es ja quasi nur von links nach rechts lesen. Daher sehe ich hier auch nicht, dass dies schlecht dokumentiert sei. Aus meiner Sicht ist dieser Teil alleine durch Verwendung der Linq-Abfragen sehr gut lesbar und damit dokumentiert.
Nur mal am Beispiel der ersten Code-Zeile:
var positive = deltaInfos.Where(h => h.Delta > 0).Average(h => h.Delta);
In dieser Zeile werden aus der Auflistung 'deltaInfos' alle Delta-Werte größer 0 ermittelt und anschließend der Durchschnitt gebildet. Der Durchschnitt wird hier dann der variable positive zugewiesen.
Auch wenn ich annehme, dass du das mittlerweile selbst heraus gefunden hast, wollte ich das zur Erläuterung hier noch einmal aufnehmen.
Auch wenn der Beitrag hier schon älter ist. Habe ich dich richtig verstanden, dass du jetzt Rechtecke und Linien erzeugst in dem du mehrere PictureBox-Controls auf deine Oberfläche ziehst?
Hier wäre selbst zeichnen über OnPaint tatsächlich die bessere alternative gewesen. Das ist eigentlich auch nicht sonderlich kompliziert.
Ich weiß noch nicht mal genau, wie sich die Box verhält, wenn man die DSL-Verbindung kappt und ob das nicht automatisch wieder eine neue Verbindung aufbaut.
Zur Version 1.0 hab ich leider keine Ahnung mehr wie es aufgebaut war.
In der aktuellen Version stehen dir in WANIPConnectionClient und WANPPPConnectionClient je nachdem welche Verbindungsart du hast Methoden zur Verfügung zum Beenden der Internetverbindung und zum Neuaufbau der Verbindung.
Was mich aber eher interessiert, woran scheiterst du bei der aktuellen Version? - In wie fern bekommst du die nicht zum laufen? => das gerne per PN. Damit müssen wir den Thread hier nicht zu ballern.
Spätestens wenn die Nutzer gleichzeitig auf der "Datenbank" arbeiten können sollen, ist Access keine gute Idee mehr.
Ansonsten würde ich mir im ersten Schritt nicht so viele Gedanken über das UI machen. Wichtiger ist erst einmal, die Logik und Datenhaltung zu implementieren. Am Ende entscheidest du dich ja vielleicht statt einer Anwendung für eine Webapplikation.
Hallo,
erstellst du im Code eine neue Instanz von "TestClass"? Dann ist natürlich klar, dass nichts passiert. Damit generierst du ein komplett neues Objekt was mit dem an die Controls gebundenen Objekt nichts zu tun hat.
Du musst hier auf jeden Fall genau das TestClass-Objekt verwenden, dass du dem Control auch in den Binding festgelegt hast.
Mir fehlen hier irgendwie details.
Ist es wirklich ein: Du klickst auf die *.exe-Datei und es passiert einfach gar nichts?
Wenn irgendwelche notwendigen Dateien fehlen würden, sollte dir eigentlich ein Exception-Fenster aufgehen. Esseidenn du fängst die Exceptions ab und tust nichts damit.
Hallo ClaraSoft,
der Hinweis ist zwar gut. Aber: An dieser Stelle ist es nicht erforderlich den Basistyp zu verwenden. Und an Stellen, wo ohnehin der Konkrete Typ bekannt ist kann und sollte der verwendet werden.
Erst wenn es komplexer wird und die konkreten Typen nicht mehr bekannt sind, sollte und muss man auf die Basisklasse zurück greifen. Hier absolut nicht erforderlich.
Hallo,
du hast dich zwar im Subforum verirrt aber ich versuche dennoch mal zu helfen. 🙂
Edit gfoidl: habs verschoben.
Und zwar mit einem Link der dir weiterhelfen sollte: Interface - C#-Referenz
Und ansonsten ist die Aufgabe relativ einfach zu Lösen. Du generierst eine Liste mit Objekten vom Typ ILebewesen und fügst dieser deine einzelnen Lebewesen hinzu.
List<ILebewesen> lebewesen = new List<ILebewesen>();
Mensch mensch = new Mensch();
// ...
lebewesen.Add(mensch);
Im Anschluss brauchst du dann nur noch mit Hilfe einer foreach-Schleife die einzelnen Lebewesen durchgehen und ausgeben.
EDIT: Vergiss die Liste. Du sollst ja ein Array von ILebewesen verwenden. - Aber ist jetzt auch nicht sonderlich schwerer.
Verstehe ich das richtig, dass "nach Worten suchen" und "Zeile wählen" zwei getrennte Funktionalitäten sind?
Das wäre doch recht einfach machbar in dem du via Index auf deine Liste "FileLines" zugreifst. Oder verstehe ich an der Anforderung irgendwas falsch?
Hallo Wilfried,
der Nutzer hat doch jederzeit selbst die Möglichkeit einen Link in einem neuen Tab zu öffnen. Dazu einfach die mittlere Maustaste / das Mausrad reindrücken.
Sind die 11 Zeichen pro Zeile eigentlich ernst gemeint? Dann wird doch die hälfte verschluckt. Ich meine klar, wenn nur die Kommas ausgegeben werden passt es. - Aber die Zahlen sind ja schon 22 Zeichen auf 7 Zeilen.
Sind hier nicht eher 22 Zeichen pro Zeile gemeint und nur die Kommas sollen weggelassen werden?
Ich würde schon mal vorschlagen, erst das Bytearray einzulesen und dann die Seriennummer auszugeben.
Spart dir nämlich eine ganze Schleife für die Ausgabe.
// EDIT: Ach nein. Du hast ja gar keine zusätzliche Schleifen.
// Dennoch weiterhin. Hole dir erst das vollständige Array und schreibe dann den Text in die Textbox.
LogLevel unterstützen denke ich alle vernünftigen Lösungen (z.B. Log4Net). Das Filtern bezüglich der IP-Adressen wirst du jedoch selbst implementieren müssen.
Fummel das am besten so nicht im Code Behind zusammen. Erstelle dir eine Klasse, welche dein Objekt enthält z.B. etwas wie:
public class DateSelectionEntry
{
private DateTime _date;
public DateTime Date
{
get { return _date; }
set { _date = value; }
}
public string DisplayText
{
get { return this._date.ToString("d M"); }
}
}
Das sauber per DataBinding angebunden (natürlich die Klasse auch ensprechend angepasst) ist deutlich besser als zu versuchen da über den CodeBehind was zusammen zu fummeln.
Wie ich schrieb, liegt es am Wechsel des Nutzerkontextes.
Nutzer XYZ verbindet das Netzlaufwerk mit seinen Berechtigungen. Wenn jetzt Nutzer ABC eine Anwendung unter seinem Namen startet, ist das doch nix anderes als hätte er sich mit seinem eigenen Konto angemeldet und die Anwendung gestartet. Warum sollte er hier also die Netzlaufwerke von XYZ sehen können? Schon in Bezug auf Computersicherheit wäre das etwas unglücklich.
Wobei ich bis heute auch noch nicht ganz durchgeblickt habe, warum das Berechtigungssystem mit Windows 7 so stark abgeändert wurde, dass man um eine Anwendung wirklich als Admin zu starten (der man ja eigentlich schon ist) einen Kontextwechsel ausführen muss.
Ich meine klar. der Grund ist mir durchaus geläufig. Das erhöht einfach erheblich die Sicherheit des Systems. Ist aber im Umkehrschluss halt häufig auch so semi cool.
Mal davon ab, dass ich es für eine schlechte Idee halte Anwendungen automatisch zu beenden, an denen gerade jemand arbeitet eventuell folgender Ansatz:
Die Anwendung muss dann zyklisch die Tabelle anfragen und auf das Flag prüfen. - Ist es "1" wird ein Hinweis in der Anwendung angezeigt, mit der Möglichkeit die Anwendung zu beenden. Bestätigt der Nutzer das nicht, läuft die Anwendung einfach weiter.
Haben alle Nutzer bestätigt und die Anwendung beendet, kannst du dein Update ausführen und das Flag wieder auf 0 setzen.
Schön ist die Lösung nicht, aber es ist neben der Lösung von BerndFfm, das einzige was mir einfällt was halbwegs i.O. erscheint.
Hallo,
wenn es Netzlaufwerke sind, die mit Zugangsdaten des Nutzers verbunden werden, liegt es tatsächlich daran, dass die Anwendung mit Adminrechten ausgeführt wird.
Das liegt einfach daran, dass damit in einem anderen Nutzerkontext gewechselt wird.
Nein du musst gar nichts in einen String umwandeln. Du liest die Bytes und anhand der Werte (Rückumwandlung in UInt16) weißt du, wie die Antwort aussieht.
Was hast denn du die ganze Zeit mit deinen Zeichen / Strings?
@inflames2k
Da liegst du leider nicht richtig. E§s muss die gesamte Sequenz übermittelt werden "01 00 00 00". Das sind dann mit Blanks 11 Zeichen.
Und wo genau steht in der Schnittstellenbeschreibung dass du Zeichen übertragen sollst?
Schon die Beschreibung gibt ja her, dass du da was nicht richtig machst:
Rechnet man jetzt mal zusammen, wie viele Bytes das ergibt sind wir bei 4 und nicht bei 11.
der Client daraus "4849324848324848324848" Byte
Das wäre ein sehr mehrkwürdiger Byte-Wert. Sicher dass du dort nicht irgendwelche ASCII Zeichen liest?
Versuchen wir mal deine Dezimalen Werte die du als "Byte" annimmst in ASCII umzuwandeln.
Dec. 48 = Hex. 30
Dec. 49 = Hex. 31
Dec. 32 = Hex. 20
Insofern scheint ja zumindest das anzukommen, was du auch versendest. Allerdings ist das was du versendest nicht korrekt. Übrigens verschickst du 11 Bytes und nicht wie Eingangs in der Beschreibung angeführt, 2 die du versenden sollst.
Fragst du nämlich mich sollte dein Byte Array das du versendest folgende Werte haben:
1
0
Bei TCP/IP Kommunikation werden immer Bytes versendet.
Im allgemeinen solltest du mehr erklären. Wir kennen weder die Spezifikation der Kamera, noch weiß ich persönlich was "YAT" ist.
Nur um noch über das Ergebnis zu informieren:
Mit dem Bridgemode und Konfiguration der Fritz!Box auf Verwendung eines vorhandenen Kabelmodems funktioniert alles genau so, wie ich es brauche.
Eine gute Anleitung bietet dafür AVM. FRITZ!Box für Betrieb am Kabelanschluss einrichten.
Funktioniert soweit ich das sehe auch mit allen aktuellen Geräten.
Hallo Stefan.Haegele,
natürlich ist angedacht in Zukunft auf ein Kabelrouter von AVM zu wechseln. - Allerdings mag ich nicht gerne mit Mietgeräten hantieren, weswegen ich das erst einmal nach hinten geschoben habe. - Finanziell ist jetzt ein neuer Router einfach nicht drin.
Aber nach langem suchen habe ich wohl einen Weg gefunden der viel versprechend ist. Kann ich aber erst am Mittwoch ausprobieren, weil es so lang dauert bis V/KD den Homespot abgeschaltet hat.
Laut einigen Sachen die ich im Netz dazu gefunden habe, muss die Kabel-Box von V/KD nur im Bridgemodus betrieben werden und die Internetverbindung anschließend über den Assistenten neu eingerichtet werden (Betrieb an Kabel-Modem).
Hallo,
in meiner neuen Wohnung habe ich auf Kabel-Internet von Kabel Deutschland gesetzt. - Der gelieferte Standard Router soll hierbei jedoch "nur" als Modem dienen. - Daher habe ich meine Fritz!Box als IP-Client angeschlossen.
In der Fritz!Box ist seit langem der VPN Zugriff und DynDNS aktiv. Natürlich bekommt die Fritz!Box die Neueinwahl nun nicht mit. Welche Möglichkeiten, außer einen zusätzlichen Progrämmchen auf weiterer Hardware stehen mir denn jetzt zur Verfügung den DynDNS Anbieter über die geänderte IP-Adresse zu informieren?
DynDNS auf der Kabel Deutschland Hardware zu aktivieren möchte ich eigentlich vermeiden.
Hallo Chessman31,
Du meinst im Windows Forms Designer? Kannst du mal einen Screenshot davon zeigen?
Mach mal wie Th69 schrieb einen Screenshot und poste hänge diesen an.
Kannst du denn direkt über die Items-Collection Menüeinträge hinzufügen?
Hallo,
ich kann xml ändern.
was für Informationen beschreiben denn die "Settings"? Das sind doch wenn ich dich richtig verstehe irgendwelche Parameter für eine andere Schnittstelle (du schriebst: "und möchte sie konvertieren in Bytes und über den Serialport senden").
Dann haben die einzelnen Parameter ja sicherlich sprechende Namen.
Ansonsten, da du ja schreibst du kannst die XML frei ändern. Was spricht also dagegen dein Configuration-Objekt direkt zu serialisieren / deserialisieren? Das Xml sehe hier ja auch nur ein klein wenig anders aus:
<?xml version="1.0"?>
<Configuration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Settings1>10</Settings1>
<Settings2>0</Settings2>
</Configuration>
Und wenns dann doch "Settings" heißen soll im Root:
[XmlRoot("Settings")]
public class Configuration
Ist das Xml so vorgegeben oder kannst du das frei ändern?
Ansonsten.. wieso arbeitest du mit Reflection? Ich würde die Parameter einfach in einer Schleife durchgehen und anhand des Parameters den entsprechenden Wert setzen.
Configuration configuration = new Configuration();
foreach(Parameter parameter in settings.Parameters)
{
switch(parameter.Name)
{
case "Settings1":
configuration.Settings1 = Convert.ToUInt32(parameter.Value);
break;
....
}
}
Das wäre am Ende die sicherste Variante auf deinem Weg.
Ansonsten wenn man bei deinem Ansatz bleibt:
object oValue = settings.Parameters.Find(item => item.Name == prop.Name).Value;
prop.SetValue(configuration , Convert.ChangeType(oValue, prop.PropertyType));
Vielen dank. Das wars. 😉
Hab ich absolut nicht gesehen.
was würdet ihr empfehlen bei einer kleinen App, soll ich den Austausch von Informationen zwischen Klassen per Eventhandler oder Nachrichten schicken umsetzen?
Nachrichten in welcher Form? Zumal das stark abhängig vom Aufbau der Anwendung ist. Und wenns eine kleine Anwendung ist, sollte i.d.R. die einfache Werterückgabe von aufgerufenen Methoden ausreichen.
Hallo,
ich bin gerade dabei für Windows CE eine Rotationsfunktion für ein Array von Punkten zu schreiben, die anschließend gezeichnet werden sollen. Das funktioniert soweit erst einmal auch. Allerdings scheine ich irgendwo einen Knoten zu haben, da es augenscheinlich zusätzlich um die Z-Achse rotiert.
Meine Funktion ur Rotation sieht wie folgt aus:
private Point[] Rotate(Point[] originalPoints, int angle, Point middlePoint)
{
Point[] rotatedArrowPoints = new Point[originalPoints.Length];
for (int i = 0; i < originalPoints.Length; i++)
{
// Punkte um den Mittelpunkt verschieben (Standard 0,0 = oben links)
double x = originalPoints[i].X - middlePoint.X;
double y = -originalPoints[i].Y + middlePoint.Y;
// Berechnung neue Koordinaten
x = (x * Math.Cos(angle * Math.PI / 180)) - (y * Math.Sin(angle * Math.PI / 180));
y = (x * Math.Sin(angle * Math.PI / 180)) + (y * Math.Cos(angle * Math.PI / 180));
// Verschiebung um Mittelpunkt rückgängig machen
x = x + middlePoint.X;
y = (y - middlePoint.Y) * -1;
rotatedArrowPoints[i] = new Point((Int32)x, (Int32)y);
}
return rotatedArrowPoints;
}
Auch ohne die Multiplikation mit Math.PI / 180 sieht das Ergebnis ähnlich verkorkst aus. - Lediglich bei 0 und 180 grad sieht das Bild korrekt aus. Hat jemand eine Idee, an welcher Stelle ich den Rechenfehler mache?
Das Bild im Anhang zeigt die verwendete Beispielzeichnung bei 0°, 30° und 90 °.
Haben es jetzt so gelöst, dass das generierte Soap in etwa dem entspricht, was Asmx-Webservices auch generieren, durch Verwendung von MessageContracts.
Ist zwar ein wenig Klassen-OVerhead im Dienst, dafür bleibt die Client-Anbindung einfach.
Hallo,
für normale Webservices ("Service.asmx") nutzen wir einen Authentifizierungsmechanismus mit einem "ServiceAuthenticationHeader". Für ein aktuelles Projekt brauchen wir dies auch für WCF Services.
Das wichtige ist, dass der SoapHeader genauso aussehen soll wie beim normalen Webservice.
<Header>
<ServiceAuthHeader>
<UserID>...</UserID>
<Password>...</Password>
</ServiceAuthHeader>
</Header>
<Body>
</Body>
Das funktioniert soweit, wenn ich im Client den ServiceAuthHeader noch mal bekannt mache und als MessageContract bekannt gebe. Dann kann ich den Header mit Hilfe von folgendem hinzufügen:
using (ServiceClient client = new ServiceClient())
{
using (OperationContext ctx = new OperationContext(client.InnerChannel))
{
ServiceAuthHeader header = this.GetAuthHeader();
System.ServiceModel.Channels.MessageHeader authHeader = System.ServiceModel.Channels.MessageHeader.CreateHeader("ServiceAuthHeader", string.Empty, header);
System.ServiceModel.OperationContext.Current.OutgoingMessageHeaders.Add(authHeader);
// execute service call
// ...
}
}
Das unschöne daran ist, dass der Aufrufer die ServiceAuthHeader-Klasse quasi selbst noch einmal entwickeln muss mit den entsprechenden Eigenschaften. Gibt es hier einen Weg, wo svcutil den Header schon im Client-Proxy mit generiert?
Bei dem ganzen handelt es sich um eine Schnittstelle für einen externen Dienstleister. - Daher wollen wir es diesem nun auch nicht unnötig schwer machen den AuthHeader abzubilden.
Bei einfachen Webservices reicht es in der Service.asmx.cs den ServiceAuthHeader als Property hinzuzufügen.
Hallo BhaaL,
das hatte ich auch schon gefunden. Allerdings ist das Diif Ergebnis dort jetzt nicht wirklich brauchbar bzw. sehr komplex.
Bei Unterschieden in den Werten gibt er nur die Indizes der Knoten aus, die sich geändert haben und den neuen Wert.
Habe nun basierend auf Palladin007's Vorschlag eine aktuell gut funktionierende Lösung gefunden.
Ich danke an der Stelle schon einmal.
Verwendetes Datenbanksystem: XML
Für ein aktuelles Projekt muss ich ein Xml-File mit seinem Vorgänger vergleichen und alle Änderungen zusammenfassen.
Dabei sollen teilweise Xml-Knoten beim Vergleich ausgeschlossen werden.
Im Ergebnis sollen anschließend n-Xml Dateien raus kommen, die jeweils den geänderten Knoten und den alten sowie neuen Wert und alle ignorierten Werte enthält.
Beispiel:
Vorher:
<Data>
<Buffer>10</Buffer>
<Status>1</Status>
<ReadTime>dd.MM.yyyy HH:mm:ss</ReadTime>
</Data>
Nachher:
<Data>
<Buffer>20</Buffer>
<Status>1</Status>
<ReadTime>dd.MM.yyyy HH:mm:ss</ReadTime>
</Data>
Im Ergebnis soll jetzt folgendes ausgegeben werden:
<Diff>
<NodeName>Buffer</NodeName>
<PreviousValue>10</PreviousValue>
<CurrentValue>20</CurrentValue>
<Data>
<Buffer>20</Buffer>
<ReadTime>dd.MM.yyyy HH:mm:ss</ReadTime>
</Data>
</Diff>
Bei dem flachen Xml kein Problem. Das wird straight forward runterprogrammiert und die Xml Knotenweise durchgegangen. Die Knoten aus der alten Xml werden dann mithilfe des NodeNamen aus der neuen gelesen.
Allerdings habe ich einen Knoten im Kopf, wie ich das bei Xml-Dateien bewerkstellige, die eben nicht flach alle Informationen auf einer Ebene haben. Hat hier jemand eine Idee bzw. einen Vorschlag?
Aber meiner Erfahrung nach hat DataBinding auch so seine Tücken in MultiThreaded Szenarien.
Ich scheitere z.B. trotz Jahrelanger Erfahrung in der Entwicklung immer noch daran, in Windows Forms eine vernünftige Synchronisierung hinzubekommen. Denn nur davon, dass ich meine BindingList oder ähnliches ans Grid pappe kann ich trotzdem nicht einfach in einem anderen Thread Einträge bearbeiten, entfernen und hinzufügen ohne das mir eine entsprechende Exception um die Ohren fliegt.
Noch mal zu den Board und Thread Status. Es gibt ja den Link "Forenbereich als gelesen markieren.". Der funktioniert auch erst mal soweit. Alle ungelesenen Themen werden als gelesen markiert. - Auch das Board selbst bekommt den gelesen Status.
Allerdings habe ich gestern erst einmal alle auf gelesen gesetzt. Heute sind diese wieder als ungelesen markiert. Hat das noch jemand oder liegt das an mir?
Kennst du denn die groben Bytepositionen? Dann würde ich das File einlesen und dann die entsprechenden Bytes auslesen.
Andernfalls wird es schon schwieriger, wenn du tatsächlich über bestimmte Inhaltsmuster gehen musst.
Indem du statt dem festen Datum z.B. DateTime.Now rein gibst.
Das hat jetzt aber im allgemeinen nix mit JSON sondern mehr mit Grundlagen zu tun.
Allgemein solltest du versuchen statt das Objekt selbst zusammen zu bauen mit JSON Serialisierung zu arbeiten.
Huh, sehe grade das scheint ein Bug in VS zu sein. Hab einfach mal versucht ein geerbtes Formular zu erstellen. Und siehe da. Gleicher Fehler (hier: VS Professional 2017).
Ich empfehle dir ohnehin: Verweise auf die Bibliothek mit dem BaseForm, erstelle ein neues Formular und ändere den Basistyp von Form auf dein BaseForm.
Damit solltest du allen ärger aus dem Weg gehen.
Das klingt von der Fehlermeldung her, als ob du eine Unmanaged DLL z. B. in C++ vorliegen hast.
Eine normal in C# oder C++/CLI Assembly (DLL) sollte sich Problemlos einbinden lassen.
Im .NET Umfeld empfehle ich den Oracle.ManagedDataAccess aus den Oracle-Komponenten. Ein großer Vorteil bei diesem ist nämlich dass bei richtiger Verwendung gar keine Oracle Client Installation auf dem Zielsystem erforderlich ist.
Denn die korrekte Installation des Oracle Clients ist auch immer so eine Sache. Vor allem, wenn man den x86 und den x64 Client benötigt.
Hast es denn mal auf einem Windows Rechner probiert?
Finde leider auch nur Beiträge, wo Leute nach dem Update auf Version 2 der Microsoft Datenprovider Fehler hatten. - Möglicherweise liegts daran? Hast du mal eine ältere Version des Packages probiert?
@inflames2k, in der Konsolenapplikation ohne Service gibt es doch noch gar keinen DataProcessor.
Nun, wenn du deinen eigenen Code nicht liest. Dann verstehe ich die Wurzel der Probleme.
Dass der Service "und nur der Service (inkl. DataProzessor)" nicht für diese Art Anwendung geeignet ist sage ich ja schon lange, daher muss ja etwas anderes her.
Ja genau. - Nämlich die korrekte Variante ohne Timer. - Was passiert denn wenn du deinen DataProcessor direkt ausführst statt über den Timer? - Dort sollte man ansetzen den Fehler zu suchen und nicht irgendetwas Wild mit Timern dahinter zu Frickeln damit überhaupt was startet.
Übrigens wenn das gezeigte nur als Konsole ausgeführt wird, kommt der Timer entgegen deiner Ansicht gar nicht zum Zug, nur beim auführen des Services. Das erkennt man kurzerhand im Beispiel über den Link.
Das habe ich auch nie behauptet. - Im Gegenteil. Ich habe dich drauf hingewiesen, dass er ja dort - wo dein Programm funktioniert - eben nicht zum Einsatz kommt.
Nun weiß ich auch, wo das ganze Problem her kommt. - Du schreibst leider nur ab, was in der Anleitung vorgegeben ist ohne dir weitere Gedanken darüber zu machen. Für den in der Anleitung verwendeten Anwendungsfall [der auch nur ein Beispiel ist] macht der Timer natürlich sinn. - Für deinen Fall aber nicht. - Also als erstes Weg mit dem Timer. Danach können wir uns der weiteren Probleme annehmen.
Gibt es denn Gründe, warum du den Microsoft.Data.SqlClient nimmst statt den System.SqlClient? Vorallem, wenns mit dem System Provider geht.
Mal ein kleiner Wunsch noch von meiner Seite. Kann der Hinweis, dass ein Beitrag durch den Author bearbeitet wurde etwas dezenter dargestellt werden?
Dein Problem hat nichts. Aber auch gar nichts mit Diensten an sich zu tun. Wenn du das in der Service-Klasse gezeigte in einer Konsole ausführst, wirst du auf genau die gleichen Probleme stoßen.
Der riesen Unterschied den du eben fabriziert hast ist:
Wenn du jetzt noch verstehst, was ich versuche dir zu sagen, solltest du der Lösung für dein Problem schon näher kommen.
Wenn es bei Ausführung ohne den Timer zu Fehlern kommt, dann poste diesen doch mal. - Aber der Timer macht ohnehin wie schon von anderer Stelle angemerkt keinen Sinn.
Hat der User überhaupt Zugriff auf die master Datenbank? Versuche doch doch mal mit diesem User per SQL Server Management Studio anzumelden und prfüe ob du Zugriff auf die master Datenbank hast.
Übrigens sollten Systemdatenbanken tabu sein es gibt eigentlich keinen Grund darauf direkt zuzugreifen.
Auch wenn deine Einwände korrekt sind gehe ich immer noch davon aus, dass derartige Sachen nicht zu dem genannten Fehler führen.
Für fehlende Berechtigungen auf eine bestimmte Datenbank wird der SQL-Server und die Client-Bibliothek andere Exceptions. Beispielsweise:
Fehlermeldung:
cannot open database masterrequested by the login. the login failed
Nach der Beschreibung macht deine MessageReceiverService -Klasse speziell mit dem Timer noch weniger Sinn.
Du erzeugst alle 10 Sekunden einen neuen DataProcessor mit der darunter liegenden Logik. - Wenn ich ins blaue raten sollte knallt dir die Laufzeit dann beim 2. Start deiner Server-Methode die Exception raus, da der Port bereits verwendet wird.
Im Allgemeinen wäre es wohl besser einen Listener-Thread zu verwenden und nicht zyklisch neu den Listener aufzubauen.
Was du im Code machst ist:
Solang dieser Ablauf jetzt durch rennt, hast du das Problem, dass alle 10 Sekunden ein neuer Listener erstellt werden soll und das ganze noch mal starten soll. Du kannst aber nur einmal auf den Port horchen.
Geschickter wäre es also mit den Asynchronen-Methoden der Netzwerkklassen zu arbeiten und genau eine Listener Instanz zu verwenden.