我已经开始了多线程中的特殊课程,但我有一些基本问题需要解决。说我有一个线程创建线程和阻止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()等
在C#5.0,你会使用异步/ AWAIT,C#4.0中,您会使用任务与延续,在它之前,你会使用背景工人或某个线程或线程池异步通知类型不同步等待。 –
通常,使用线程在UI应用程序中运行后台任务,然后在任务完成时阻塞UI线程是非常糟糕的主意*。你没有抽出消息,应用程序变得没有反应。你可以在'while(alive)'块中用'Application.DoEvents()'来破解它,但是这会产生比解决问题更多的问题。通常,在任何UI应用程序中,主UI线程都应该具有响应能力并且能够随时抽出消息。 – Baldrick
t1.Join()是一个阻塞呼叫。它实际上等待线程t1开始的前一个调用完成。 – rajibdotnet