我是线程编程的新手。我必须在PARALLEL和后台运行一些任务(以便主UI执行线程保持对用户操作的响应)并等待每个任务完成,然后再继续执行。
类似的东西:
foreach(MyTask t in myTasks)
{
t.DoSomethinginBackground(); // There could be n number of task, to save
// processing time I wish to run each of them
// in parallel
}
// Wait till all tasks complete doing something parallel in background
Console.Write("All tasks Completed. Now we can do further processing");
我知道有几种方法可以实现这一目标。但我正在寻找在.Net 4.0(C#)中实现的最佳解决方案。
答案 0 :(得分:7)
对我而言,您似乎想要Parallel.ForEach
Parallel.ForEach(myTasks, t => t.DoSomethingInBackground());
Console.Write("All tasks Completed. Now we can do further processing");
您还可以在单个循环中执行多项任务
List<string> results = new List<string>(myTasks.Count);
Parallel.ForEach(myTasks, t =>
{
string result = t.DoSomethingInBackground();
lock (results)
{ // lock the list to avoid race conditions
results.Add(result);
}
});
为了让主UI线程保持响应,您需要使用BackgroundWorker
并订阅其DoWork
和RunWorkerCompleted
个事件,然后调用
worker.RunWorkerAsync();
worker.RunWorkerAsync(argument); // argument is an object
答案 1 :(得分:2)
答案 2 :(得分:1)
您可以使用Task
库来完成:
string[] urls = ...;
var tasks = urls.Select(url => Task.Factory.StartNew(() => DoSomething(url)));
为避免锁定UI线程,您可以在.NET 4.0中使用ContinueWhenAll
:
Task.Factory.ContinueWhenAll(tasks.ToArray(), _ =>
Console.Write("All tasks Completed. Now we can do further processing");
);
如果您使用的是最新版本的.NET,则可以使用Task.WhenAll
代替
答案 3 :(得分:0)
如果您使用Net 4.0或更高版本,请参阅Parallel类和Task类。 Joseph Albahari写了非常清晰的书:http://www.albahari.com/threading/part5.aspx#_Creating_and_Starting_Tasks