2017-07-07 4 views
0


Ich habe einen ‚Haupt‘ Server und einige andere Server (Extensions), die vom Hauptserver gesteuert werden müssen.Asynchrone Kommunikation mit mehreren Webservern C#

Die Extensions haben jeweils eine Web-Referenz auf ihren jeweiligen Server. Die Steuerung dieser Erweiterungen erfolgt durch Init(), Start() und Stop() Web-Anrufe. Bis jetzt habe ich diese synchron, der Hauptserver zum Beispiel ruft:

public void InitExtensions() 
{ 
    foreach (Extension extension in GetEnabledExtensionList()) 
    { 
     extension.Init(); 
    } 
} 

Und als:

public void StartExtensions() 
{ 
    foreach (Extension extension in GetEnabledExtensionList()) 
    { 
     extension.Start(); 
    } 
} 

Wo die extension.Init() und extension.Start() wird Webcalls machen.

Jetzt möchte ich dies asynchron tun, aber der schwierige Teil ist, dass die StartExtensions() Methode warten sollte, bis die extension.Init() abgeschlossen ist. Eine andere Erweiterung kann natürlich gestartet werden, bevor eine andere initialisiert wird.

Was ist der beste Weg, dies zu tun? Ich denke, ich werde zum Beispiel brauchen listet

List<Thread> _InitThreads; 
List<Thread> _StartThreads; 
List<Thread> _StopThreads; 

und überprüfen, ob jede Liste einen Thread für die jeweilige Erweiterung enthält, und Join() er die Ausführung warten. Dies wird jedoch sehr schwierig, sehr schnell ...

Antwort

0

Sie können parallel foreach verwenden. Dies führt die Iterationen parallel (asynchron) und wartet, bis alle Iterationen abgeschlossen sind (Mittel wird im nächsten Anruf nach foreach ausgeführt werden, nachdem alle Iterationen arbeiten fertig)

Parallel.ForEach(GetEnabledExtensionList(), (extension) => 
{ 
    extension.Init(); 
    extension.Start(); 
}); 

Dies ist ein guter Weg, weil Sie wissen, wenn Alle Ihre Server wurden gestartet und auch die parallelen Aufgaben/Threads werden vom Betriebssystem effizient behandelt (Anzahl, Priorität usw.).

+0

Danke, es funktioniert! –

+0

Ich bin glücklich zu helfen. Könnten Sie es als Antwort markieren? – andrisbandris

0

Dies sollte es tun, Ihre Init unter der Annahme() -Methode synchron ist (dh Sie nicht auf ein Ereignis warten müssen, um es zu sagen, beendet)

public void InitAndStartExtensions() 
{ 
    foreach (Extension extension in GetEnabledExtensionList()) 
    { 
     Task.Run(() => 
     { 
      extension.Init(); 
      extension.Start(); 
     }); 
    } 
} 
+0

Danke, das hat funktioniert –

Verwandte Themen