2015-06-20 64 views
0

讓我們假設我有幾個層次:對推式模型中的每個圖層使用TaskFactory.StartNew是否是一種很好的做法?

  1. 經理從套接字讀取數據
  2. 經理訂閱了#1和大約需要持續的數據
  3. 經理訂閱了#2和護理需要關心的數據的反序列化和傳播爲鍵入了在某些事件類型
  4. WPF控制器,顯示數據insterested管理者(訂閱#3)

截至目前我使用

TaskFactory.StartNew(()=>subscriber.Publish(data)); 

在每一層上。原因是我不想想要依靠這樣一個事實,即每個經理都會盡快完成他的工作,套接字管理器沒有卡住。

這是一個很好的方法嗎?

編輯 假設插槽管理器接收價格更新 有10個管理者訂閱插槽經理,所以當插座管理者傳播.StartNew被稱爲10倍的消息。

管理者#2,#3什麼也不做,但可以通過.StartNew消息每1個消息,以便最終從插座30倍.StartNew傳播到單個訂戶

()被調用。

+0

多線程肯定沒有內在的錯誤。你能詳細說明你的具體問題嗎?總共有多少'.StartNew()'行可以同時運行? –

+0

爲什麼不使用Task.Run()? – Transcendent

+0

@Intercendent爲什麼要使用它? http://stackoverflow.com/questions/22087005/task-factory-startnew-vs-new-task此鏈接暗示否則 –

回答

1

這似乎是一個合理的方法。

然而,如果能夠真正做到:

subscriber.PublishAsync(data).LogExceptions(Log); 

哪裏LogExceptions是一樣的東西:

// I'm thinking of Log4Net here, but of course something else could be used. 
public static Task LogExceptions(this Task task, ILog log) 
{ 
    return task.ContinueWith(ta => LogFailedTask(ta, log), TaskContinuationOptions.OnlyOnFaulted); 
} 
private static void LogFailedTask(Task ta, ILog log) 
{ 
    var aggEx = ta.Exception; 
    if(aggEx != null) 
    { 
    log.Error("Error in asynchronous event"); 
    int errCount = 0; 
    foreach(var ex in aggEx.InnerExceptions) 
     log.Error("Asynchronous error " + ++errCount, ex); 
    } 
} 

使發射後不管任務的使用還是有記錄的錯誤,並PublishAsync在轉而在適當的時候使用任務,那麼我會更開心。特別是,如果「發佈」有任何東西會阻塞可以使用async進行處理的線程,就像寫入數據庫或文件系統或從數據庫或文件系統讀取數據一樣,那麼線程的使用可能會更好地擴展。

0

關於Task.RunTaskFactory.StartNew,它們在引擎蓋下基本相同。請閱讀以下鏈接:http://blogs.msdn.com/b/pfxteam/archive/2014/12/12/10229468.aspx

儘管這些方法使用ThreadPool來提供良好的性能,但仍然存在與不斷創建新任務相關的開銷。 Task通常更多用於不經常發生的,即發即忘型的工作負載。你的聲明是「來自套接字每1條消息的30x.StartNew()」有點關注。套接字消息多久出現一次?如果你真的關心延遲,我認爲這樣做的更好方式是每個經理都應該有自己的專用線程。您可以使用BlockingQueue實現,以便線程正在等待消耗父隊列中的父輸入項。例如,這比簡單的自旋鎖更可取。

這是一種在金融市場消息訂閱和解碼中經常使用的架構,需要儘可能快的性能。另外請記住,更多的線程並不總是等同於更快的性能。如果線程具有任何共享數據依賴性,則它們將全部爭用相同的鎖,導致彼此之間的上下文切換等。這就是爲什麼預設數量的專用線程通常可以勝出,而線程創建的線程數量更多-the飛。我能想到的唯一例外就是沒有共享數據依賴性的「令人尷尬的並行」任務。請注意,依賴關係可以存在於輸入端和輸出端(線程可能會遇到的lock任何地方)。

+0

現在很難相信在WPF應用程序中創建30個對象會成爲問題。它更難相信你會實現一個更好的算法來管理自己的腳步比線程池經理會。 – Bond

+1

這一切都取決於應用程序的延遲要求。 OP建議套接字監聽器可能會收到*價格更新*消息,這表明他可能正在編寫一個應用程序,用於監聽交換(金融市場)消息。這樣的流可以分解1000個信息/秒。在這種情況下,低延遲可能是非常重要的業務需求。正如我已經寫了大約十幾個低延時交換連接器,我可以肯定地說,在這種情況下,專用線程是最好的選擇。如果我開發了一系列級聯任務的解決方案,我會被解僱。 –

相關問題