Hi,
ich habe mal wieder ein Problem.
Ich habe einen Windowsservice welcher in der OnStart ein Plugin initialisiert.
public class Service : MyPlugin
{
MyLogic = _logic;
protected override void OnStart(string[] args)
{
_logic = new MyLogic();
// initialisiere noch einige Dinge der Logic....
....
// Dann werden hier einige unterschiedliche Threads gestartet
Thread checkWorker = new Thread(check.Check);
checkWorker.IsBackground = true;
checkWorker.Start();
}
}
Wie kann ich nun Daten zwischen den Threads und Funktionen meiner Logic austauschen, also in beide Richtungen?
Danke schön
Was hast Du denn vor, was ist das Ziel?
Dann kann man Dir einen Umsetzunsgvorschlag geben.
So ist nicht erkennbar, ob der Ansatz überhaupt in die richtige Richtung geht.
Prinzipiell spielen Threads nur wenig eine Rolle bei sowas, außer man hat irgendwelche BEsonderheiten (daher Frage ich nach dem Ziel).
Grundlegend können Konzepte wie Reactive Extensions, Event Sourcing und Messages ein Kommunikationsproblem in einer UI-Anwendung völlig losgelöst von Threads oder Technologie bereits lösen.
Will man sowas selbst bauen, endet das nicht selten im Chaos.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
die Logic ist nicht Multithreading fähig, bzw. würde die sich für jeden meiner Threads (bis zu 30 Stück) neu initialisieren (an die Logic selbst komme ich nicht dran, kann da also nichts ändern), was mehrere Sekunden dauert und für jeden Thread auch Daten ablegt (SQLite-DB lokal), die dann von dem erst aufrufenden Thread gesperrt sind. Also muss ich für jeden meiner Threads die Logic neu in einem Unterordner (wegen DB) initialisieren.
Daher die Frage, ob ich die Logic einmalig initialisieren kann und dann von meinen Threads auf die Methoden in der Logic zugreifen kann.
Lies mal [Artikel] Multi-Threaded Programmierung.
Generell kannst du Daten zwischen mehreren Threads austauschen, wenn du den Zugriff per lock
absicherst.
Die Frage aber ist, wofür benötigst du bis zu 30 Threads? Gerade ein Windows-Service sollte ja ressourcenschonend arbeiten.
Wäre asynchrone Programmierung mittels Task
s nicht sinnvoller?
Ich habe so viele Threads, weil ich einen Socket Server am laufen habe und sich viele Clients verbinden.
Oder liegt hier schon das Problem?
Und ist mein Service, also die OnStart Methode auch schon ein eigener Thread?
Du kannst problemlos mittels der Callback-Variante einen Socket Server und async/await umsetzen.
Wenn Du es ganz bequem haben willst, kannst das als IHostedService implementieren, dann bekommst viele Sachen geschenkt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Kannst du mir einen kleinen Schub in die richtige Richtung geben?
Anhand eines kurzen Quelltextes?
Wenn Du nach Google-Suche nach c# socket server async suchen würdest (Google is relativ neu), dann kommst in die offizielle Microsoft Dokumentation mit einem Sample. 🙂
Wenn Du dann nach Google-Suche nach Windows Service IHostedService suchst, dann siehste Beispiele bzgl. IHostedService. 👍
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code