2010-06-04 109 views
7

我有一個控制檯應用程序,我正在移植到WPF。該應用程序有3個工作線程,在將某些輸出結果打印到屏幕之前,這些工作線程都會連接到主線程。我的理解是,如果我嘗試在WPF應用程序中做同樣的事情,GUI將被阻止,並且不會對用戶響應。那麼我怎麼能通知父線程所有的線程都完成了他們的工作?我認爲解決方案將涉及委託和事件(或者可能是BackgroundWorker?),但我不清楚如何在線程終止時調用回調。如何通知父線程所有子線程都已終止?

原始代碼:

foreach (Thread t in threadList) 
{ 
       t.Start(); 
} 

foreach (Thread t in threadList) 
{ 
       t.Join(); 
} 

// print some results here 

回答

6

如果您正在使用三個BackgroundWorker S,您可以使用事件RunWorkerCompleted注意到一個工人完成:在啓動工設置一個計數器3,那麼遞減,並通過RunWorkerCompleted如果調用的方法檢查該計數器它擊中0你完成。

1

看看這個article在MSDN雜誌,讓你使用BackgroundWorker的一個例子。從圖7開始。

3

您應該使用三個BackgroundWorkers。

然後,您可以處理他們的RunWorkerCompleted事件以瞭解操作何時完成。

0

如果你只是想輪詢的工作線程,你可以使用類似 bool threadWasDone = thread.Join(0);

1

你想完成什麼依賴。你試圖促成什麼樣的溝通?

如果我猜測,您真正想要的只是在您的應用程序中報告[或顯示]您的工作人員結果。如果是這種情況,那麼你有一個視圖模型一個典型的WPF應用程序,說

public class AwesomeViewModel : INotifyPropertyChanged 
{ 
    // if small fixed number, otherwise, you could use 
    // an ObservableCollection<T> 
    public string WorkerResultA { ... } 
    public string WorkerResultB { ... } 
    public string WorkerResultC { ... } 
} 

這是數據綁定到您的WPF控件。您可以簡單地將視圖模型的引用傳遞給每個工作線程,並且他們更新該類,而不需要在Gui線程上阻塞\等待。以這種方式,每個工人在完成時報告其結果,而不需要其他人的干預。這是最佳的。

當然,如果你繼續這樣做,you run into another completely different issue。哪個fyi可以通過Dispatcher解析。 One possible solution here

至於BackgroundWorker與明確Thread控制,這取決於你。兩者都有優點,但請記住,您已經編寫了功能性代碼。那並且在我個人看來,BackgroundWorker不是特別有用。

如果你真的絕對正必須實現更復雜的同步模式,那麼我強烈建議你刷上ManualResetEvent其表弟AutoResetEventSemaphore,關鍵字lock和一般並行編程。對不起,沒有快捷方式:)

希望這會有所幫助!