首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中同步线程

在C#中同步线程
EN

Stack Overflow用户
提问于 2014-01-07 06:48:10
回答 4查看 181关注 0票数 1

我有一份基于表格的申请表。UI由线程处理。通过UI线程,我创建了3个线程来执行一些处理。

代码语言:javascript
复制
Thread t1 = new Thread(() => performprocessing());
Thread t2 = new Thread(() => performprocessing());
Thread t3 = new Thread(() => performprocessing());

现在,我想在UI线程中执行一条语句,在所有3个线程完成它们的execution.So之后,我执行了以下操作:

代码语言:javascript
复制
do 
{

} while (t1.IsAlive || t2.IsAlive || t3.IsAlive);
/*--execute statement---*/

但是我希望UI也能保持响应性。在这种情况下,UI线程被卡在循环中,直到所有三个线程都完成执行。我该怎么做?

我读过关于手动和自动重置事件的文章,但是我不知道如何在这种情况下使用它们。请指引我。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-07 07:08:06

生成新线程是一种糟糕的做法,请使用线程池。

代码语言:javascript
复制
{
    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的一种更简洁的方法是使用异步/等待。

代码语言:javascript
复制
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。

代码语言:javascript
复制
{
    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());
}
票数 2
EN

Stack Overflow用户

发布于 2014-01-07 06:53:38

尝试使用屏障

您需要将Barrier实例传递到线程中,然后从线程中使用Barrier.SignalAndWait()。在Barrier的构造函数中指定需要处理的信号数。

一旦接收到所有信号,等待的线程将停止阻塞。

票数 5
EN

Stack Overflow用户

发布于 2014-01-07 06:53:42

使用后台工作线程,您可以保持ui响应和发送进度。

代码语言:javascript
复制
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)
        {
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20965576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档