首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >主线程等待多个后台工作线程完成

主线程等待多个后台工作线程完成
EN

Stack Overflow用户
提问于 2014-03-07 07:30:55
回答 3查看 878关注 0票数 1

我产生了多个后台工作者线程,并希望我的主线程等到所有线程都完成。解决方案是在每次生成后台工作者线程时向列表中添加一项,然后在RunWorkerCompleted中删除它们。但是,如何将列表作为参数传递给RunWorkerCompleted?

代码语言:javascript
代码运行次数:0
运行
复制
FuncA()
{
 foreach()
 {
    /* add an item to the list */
   _bw.RunWorkerAsync();
 }
 m_event.WaitOne(); /* Main thread waits here */
}
static bw_DoWork()
{

}
static bw_RunWorkerCompleted()
{ 
    /* delete item from list */
    /* if list is empty signal m_event.Set() */
}
EN

回答 3

Stack Overflow用户

发布于 2014-03-07 07:39:23

await中使用第三方公共关系使这一点变得非常简单:

代码语言:javascript
代码运行次数:0
运行
复制
private void someEventHandler()
{
    var results = await Task.WhenAll(
        Task.Run(() => ComputeSomeValue()),
        Task.Run(() => ComputeSomeOtherValue()),
        Task.Run(() => ComputeYetAnotherValue()));
    DoSomethingWithResults(results);
}

对于.NET 4.0解决方案,可以在不使用await的情况下使用任务

代码语言:javascript
代码运行次数:0
运行
复制
private void someEventHandler()
{
    Task.Factory.ContinueWhenAll(new[]{
        Task.Run(() => ComputeSomeValue()),
        Task.Run(() => ComputeSomeOtherValue()),
        Task.Run(() => ComputeYetAnotherValue())}
        , resultTask => DoSomethingWithResults(resultTask.Result);
}
票数 1
EN

Stack Overflow用户

发布于 2014-03-07 13:32:19

在调用_bw.RunWorkerAsync()时,可以将列表作为参数传递。RunWorkerAsync方法有一个重载方法,它接受一种类型的对象作为参数。

您可以在bw_DoWork事件结束时而不是在bw_RunWorkerCompleted事件中从list中删除项。后者应该在更新某些UI元素时使用。

代码语言:javascript
代码运行次数:0
运行
复制
List<object> list = new List<object>();
FuncA()
{
    foreach()
    {
        /* add an item to the list */
       _bw.RunWorkerAsync(list);
     }
    m_event.WaitOne(); /* Main thread waits here */
}
static bw_DoWork()
{
    // Do the stuff.

    /* delete item from list */
    var list = e.Argument as List<object>;
    /* if list is empty signal m_event.Set() */
}
票数 0
EN

Stack Overflow用户

发布于 2014-03-07 08:12:25

如果您使用的是.NET Framework4或更高版本,则可以使用System.Threading.CountdownEvent。在FuncA()中,在启动后台工作程序之前,您必须使用大量对象初始化信号,并且在WorkerCompleted处理程序中,您应该调用CountdownEvent的CountdownEvent ()方法。在线程中,您必须调用CountdownEvent的Wait()方法,然后在该方法之后调用所有代码,这些代码必须在稍后执行。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22238418

复制
相关文章

相似问题

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