2014-03-05 14 views
0

我已經開始了多線程中的特殊課程,但我有一些基本問題需要解決。說我有一個線程創建線程和阻止UI的用法

Thread t1 = new Thread(() => 
      { 
       Thread.CurrentThread.IsBackground = true; 
       IsCancel = false; 
       this.workProj.DoWorkWithRefSync(ref IsCancel); 
      });    
t1.Start(); 

其次

while(t1.IsAlive) 
{ 
} 

t1.Join(); 

myAutoResetEvent.WaitOne(); // myAutoResetEvent.Set() called in thread when it finished processing 

我不知道,但是,這可能不是一個很好的例子但期待一個。 我知道它們都是來自後臺線程的某種形式的信號,以通知調用/ UI線程該工作已完成。 但是使用它們最終會阻塞UI,直到線程完成。所以我想知道這個實際生活場景的實現。 我在想爲什麼不直接在UI線程上運行這個過程,因爲你不介意阻塞它。 編輯:換句話說,我正在尋找這些阻擋元素的真正用途,如thread.Join()等

+1

在C#5.0,你會使用異步/ AWAIT,C#4.0中,您會使用任務與延續,在它之前,你會使用背景工人或某個線程或線程池異步通知類型不同步等待。 –

+0

通常,使用線程在UI應用程序中運行後臺任務,然後在任務完成時阻塞UI線程是非常糟糕的主意*。你沒有抽出消息,應用程序變得沒有反應。你可以在'while(alive)'塊中用'Application.DoEvents()'來破解它,但是這會產生比解決問題更多的問題。通常,在任何UI應用程序中,主UI線程都應該具有響應能力並且能夠隨時抽出消息。 – Baldrick

+0

t1.Join()是一個阻塞呼叫。它實際上等待線程t1開始的前一個調用完成。 – rajibdotnet

回答

2

與您的示例相關的現實生活場景將是對線程的引用存儲在成員如果某些事件觸發了,例如關閉窗口或退出應用程序,它將被檢查或等待。

僞代碼:

class Window 
{ 
    private Thread _thread = null; 

    public void OnButtonClick() 
    { 
     _thread = CreateAndStartThread(); 
    } 

    public void OnCloseWindow() 
    { 
     if(null != _thread) 
      _thread.Wait(); 
    } 
} 
+0

是的 - 傳統的「關閉失敗」風險。 –

+0

Martin :)這只是爲了證明對線程的引用可能存儲在哪裏,而不是完全設計的防禦性代碼:) –