2014-03-05 15 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 :)这只是为了证明对线程的引用可能存储在哪里,而不是完全设计的防御性代码:) –