2011-04-05 19 views
7

這是從我班的一個片段:C#.net - 如何提醒程序線程已完成(事件驅動)?

public bool start() 
{ 
    Thread startThread = new Thread(this.ThreadDealer); 
    startThread.Start(); 
    return _start; 
} 

在ThreadDealer()我布爾變量「_start」設置爲false,或真。我現在需要但似乎無法弄清楚的事件是在ThreadDealer() - Thread完成時提醒start()執行它的return語句。

我用AutoResetEvent和.WaitOne()嘗試了一些東西,但是因爲我有一個只是阻止一切的GUI,而它做了我所需要的操作(等待線程完成),如果它阻止了我GUI。

任何幫助將不勝感激。

回答

6

只要舉辦一個活動。它將在錯誤的線程上運行,所以無論事件處理程序如何處理,都需要通過編組來調用,以便更新任何UI。通過使用Control.Begin/Invoke或Dispatcher.Begin/Invoke,取決於您使用的類庫。

或者使用BackgroundWorker類,它會自動執行。

24

你想要做什麼 - 等待後臺線程在UI線程的方法中,但仍然允許UI響應 - 是不可能的。您需要將代碼分成兩部分:一部分在開始(或平行)到後臺線程之前執行,另一部分在後臺線程完成之後運行。最簡單的方法是使用BackgroundWorker class。它在工作完成後在UI線程(RunWorkerCompleted)中引發了一個事件。下面是一個例子:

public void start() 
{ 
    var bw = new BackgroundWorker(); 

    // define the event handlers 
    bw.DoWork += (sender, args) => { 
     // do your lengthy stuff here -- this will happen in a separate thread 
     ... 
    }; 
    bw.RunWorkerCompleted += (sender, args) => { 
     if (args.Error != null) // if an exception occurred during DoWork, 
      MessageBox.Show(args.Error.ToString()); // do your error handling here 

     // Do whatever else you want to do after the work completed. 
     // This happens in the main UI thread. 
     ... 
    }; 

    bw.RunWorkerAsync(); // starts the background worker 

    // execution continues here in parallel to the background worker 
} 
相關問題