myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Basistechnologien und allgemeine .NET-Klassen (https://www.mycsharp.de/wbb2/board.php?boardid=23)
--- Von verschiedenen Threads auf Hauptinstanz zugreifen (https://www.mycsharp.de/wbb2/thread.php?threadid=122544)


Geschrieben von padde77 am 13.01.2020 um 14:37:
  Von verschiedenen Threads auf Hauptinstanz zugreifen
Hi,

ich habe mal wieder ein Problem.
Ich habe einen Windowsservice welcher in der OnStart ein Plugin initialisiert.

C#-Code:
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


Geschrieben von Abt am 13.01.2020 um 14:50:
 
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.


Geschrieben von padde77 am 13.01.2020 um 15:24:
 
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.


Geschrieben von Th69 am 13.01.2020 um 17:35:
 
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?


Geschrieben von padde77 am 13.01.2020 um 18:29:
 
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?


Geschrieben von Abt am 13.01.2020 um 19:05:
 
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.


Geschrieben von padde77 am 13.01.2020 um 19:27:
 
Kannst du mir einen kleinen Schub in die richtige Richtung geben?
Anhand eines kurzen Quelltextes?


Geschrieben von Abt am 13.01.2020 um 19:30:
 
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. smile

Wenn Du dann nach  Google-Suche nach Windows Service IHostedService suchst, dann siehste Beispiele bzgl. IHostedService. Daumen hoch


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 30.05.2020 22:22