我有一份基于表格的申请表。UI由线程处理。通过UI线程,我创建了3个线程来执行一些处理。
Thread t1 = new Thread(() => performprocessing());
Thread t2 = new Thread(() => performprocessing());
Thread t3 = new Thread(() => performprocessing());现在,我想在UI线程中执行一条语句,在所有3个线程完成它们的execution.So之后,我执行了以下操作:
do
{
} while (t1.IsAlive || t2.IsAlive || t3.IsAlive);
/*--execute statement---*/但是我希望UI也能保持响应性。在这种情况下,UI线程被卡在循环中,直到所有三个线程都完成执行。我该怎么做?
我读过关于手动和自动重置事件的文章,但是我不知道如何在这种情况下使用它们。请指引我。
发布于 2014-01-07 07:08:06
生成新线程是一种糟糕的做法,请使用线程池。
{
var t1 = Task.Run(() => doSomething1());
var t2 = Task.Run(() => doSomething2());
var t3 = Task.Run(() => doSomething3());
Task.WhenAll(t1, t2, t3).ContinueWith(t => doSomething4());
}.NET 4.5的一种更简洁的方法是使用异步/等待。
async void Form1_Load(object sender, EventArgs e)
{
var t1 = Task.Run(() => doSomething1());
var t2 = Task.Run(() => doSomething2());
var t3 = Task.Run(() => doSomething3());
await Task.WhenAll(t1, t2, t3);
doSomething4();
}.NET 4.0不定义Task.Run()和Task.WhenAll(),而是使用Task.Factory。
{
var t1 = Task.Factory.StartNew(() => doSomething1());
var t2 = Task.Factory.StartNew(() => doSomething2());
var t3 = Task.Factory.StartNew(() => doSomething3());
Task.Factory.ContinueWhenAll(new[] { t1, t2, t3}, tasks => doSomething4());
}发布于 2014-01-07 06:53:38
尝试使用屏障。
您需要将Barrier实例传递到线程中,然后从线程中使用Barrier.SignalAndWait()。在Barrier的构造函数中指定需要处理的信号数。
一旦接收到所有信号,等待的线程将停止阻塞。
发布于 2014-01-07 06:53:42
使用后台工作线程,您可以保持ui响应和发送进度。
void Form1_Load(object sender, EventArgs e)
{
BackgroundWorker b1 = new BackgroundWorker();
BackgroundWorker b2 = new BackgroundWorker();
BackgroundWorker b3 = new BackgroundWorker();
b1.RunWorkerCompleted += b1_RunWorkerCompleted;
b2.RunWorkerCompleted += b2_RunWorkerCompleted;
b3.RunWorkerCompleted += b3_RunWorkerCompleted;
}
void b1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
void b2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
void b3_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}https://stackoverflow.com/questions/20965576
复制相似问题