3

我是线程编程的新手。我必须在并行和后台运行一些任务(以便主 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#) 中实现的最佳解决方案。

4

3 回答 3

8

对我来说,这似乎是你想要的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 线程保持响应,您需要使用 aBackgroundWorker并订阅其DoWorkRunWorkerCompleted事件,然后调用

worker.RunWorkerAsync();
worker.RunWorkerAsync(argument); // argument is an object
于 2013-08-14T09:15:48.973 回答
1

您可以使用Task库来完成:

 string[] urls = ...;
 var tasks = urls.Select(url => Task.Factory.StartNew(() => DoSomething(url)));

为避免锁定 UI 线程,您可以ContinueWhenAll在 .NET 4.0 中使用:

Task.Factory.ContinueWhenAll(tasks.ToArray(), _ => 
    Console.Write("All tasks Completed. Now we can do further processing");
);

如果您使用的是最新版本的 .NET,则可以Task.WhenAll改用

于 2013-08-14T09:12:34.263 回答
0

如果您使用 Net 4.0 或更高版本,请参阅 Parallel 类和 Task 类。Joseph Albahari 写了非常清楚的书:http ://www.albahari.com/threading/part5.aspx#_Creating_and_Starting_Tasks

于 2013-08-14T09:17:04.563 回答