2017-07-07 127 views
0


我有一個'主'服務器,和其他幾個服務器(擴展)需要由主服務器控制。與多個Web服務器異步通信C#

擴展每個都有一個Web引用到其各自的服務器。控制這些擴展是由Init(),開始()停止()網絡調用。到現在爲止,我這樣做同步,例如主服務器調用:

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

而且比:

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

extension.Init()extension.Start()會做網絡電話。

現在我想這樣做異步,但棘手的部分是,StartExtensions()方法應該等待extension.Init()完成。不同的分機當然可以在另一個被初始化之前啓動。

這樣做的最好方法是什麼?我想我會需要例如列出

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

,並檢查是否每個列表包含了相應的擴展創建線程,並加入()它等待執行。然而,這變得很難非常快...

回答

0

你可以使用並行的foreach。這種並行執行(異步)的迭代和等待,直到所有的迭代完成(指後畢竟迭代完成工作的foreach會執行下一次調用)

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

這是一個很好的方式,因爲你會知道,當您的所有服務器都已啓動,並且並行任務/線程將被操作系統有效處理(數量,優先級等)。

+0

謝謝,它的工作原理! –

+0

我很樂意提供幫助。你能把它標記爲答案嗎? – andrisbandris

0

這應該這樣做,假設你的init()方法是同步的(即你不需要等待一個事件,告訴它已經完成)

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

謝謝,這個工作 –