Laden...

Von verschiedenen Threads auf Hauptinstanz zugreifen

Erstellt von padde77 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.916 Views
P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 4 Jahren
Von verschiedenen Threads auf Hauptinstanz zugreifen

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

16.807 Beiträge seit 2008
vor 4 Jahren

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.

P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 4 Jahren

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.

4.931 Beiträge seit 2008
vor 4 Jahren

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 Tasks nicht sinnvoller?

P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 4 Jahren

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?

16.807 Beiträge seit 2008
vor 4 Jahren

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.

P
padde77 Themenstarter:in
50 Beiträge seit 2011
vor 4 Jahren

Kannst du mir einen kleinen Schub in die richtige Richtung geben?
Anhand eines kurzen Quelltextes?

16.807 Beiträge seit 2008
vor 4 Jahren

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. 👍