Tob*_*ler 6 c# multithreading task
我的程序正在创建一些任务来完成一些工作.现在我想在退出程序之前等待所有任务完成.
我知道Task.WaitAll(...)
方法,但在我的情况下,我想动态创建一些任务 - > Task.WaitAll()
调用时它们不存在.
我现在的问题是:如何完成所有正在运行的任务?
这就是我现在正在做的事情.
它有效,但我想确保这也是一个很好的方法.
public class Test
{
public ConcurrentBag<Task> RunningTasks { get; set; }
public Test()
{
RunningTasks = new ConcurrentBag<Task>();
}
public void RunIt(){
//...create some Tasks asynchronously so they may be created in a few seconds and add them to the list like
//RunningTasks.Add(...);
//Just wait until all tasks finished.
var waitTask = Task.Run(() =>
{
while (true)
{
if (RunningTasks.All(t => t.IsCompleted))
break;
Thread.Sleep(1000);
}
});
waitTask.Wait();
}
}
Run Code Online (Sandbox Code Playgroud)
Task.WhenAll()
将采用 , 的数组Task
,并且ConcurrentBag<T>
支持ToArray()
扩展方法,因此您可以简单地执行以下操作:
await Task.WhenAll(RunningTasks.ToArray())
Run Code Online (Sandbox Code Playgroud)
或者如果您不想使用await
关键字:
Task.WhenAll(RunningTasks.ToArray()).Wait()
Run Code Online (Sandbox Code Playgroud)
更新
因此,如果您RunningTasks
在初始调用后更改,您可以很容易地执行此操作来处理它:
while(RunningTasks.Any(t=>!t.IsCompleted))
{
Task.WhenAll(RunningTasks.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
相对于您的方法的主要好处是,这将在线程等待时将线程交给其他工作,在那里您的代码将线程处于睡眠状态,直到所有任务完成。
归档时间: |
|
查看次数: |
1153 次 |
最近记录: |