【发布时间】:2014-07-22 09:47:17
【问题描述】:
我使用的是 Asp.Net 4.0。
我还有一个 HashSet,我想从中异步创建和运行任务,等待它们全部完成并应用超时。下面的代码是我目前所拥有的,但是考虑到使用 TPL 给猫剥皮的方法有很多,这是否可以改进,或者是否存在任何关键问题?
TaskWrapper[] taskWrappers = new TaskWrapper[nodeCount];
Task<ResponseWrapper>[] tasks = new Task<ResponseWrapper>[nodeCount];
int i = 0;
foreach (var n in rt.Nodes)
{
tasks[i] = Task<ResponseWrapper>.Factory.StartNew(() => MyMethod.Submit(n.Data, timeout));
taskWrappers[i].LeadPointID = n.LeadPointID;
// other wrapper stuff;
taskWrappers[i].Task = tasks[i];
i++;
}
Task.WaitAll(tasks, timeout);
阅读好心提供的文章后,似乎这种代码结构将是首选的工作方法:
class MyService2
{
public int CalculateMandelbrot()
{
// Tons of work to do in here!
for (int i = 0; i != 10000000; ++i)
;
return 42;
}
}
private async void MyButton_Click(object sender, EventArgs e)
{
await Task.Run(() => myService.CalculateMandelbrot());
}
但是,正如我之前指出的,我无权访问 VS2012,因此作为起点,是否有与此模式等效的 VS2010?
【问题讨论】:
-
如果一切都按要求工作,感觉应该在 codereview.stackexchange.com 上。
-
使用 C# 4(.NET 4.0 附带)你应该小心capturing foreach loops variables。
-
看起来不错。没有错。尽管异步现在风靡一时,但使用同步阻塞调用尤其没有错。我会用功能性
Select(例如rt.Nodes.Select(n => ...))替换命令式循环。 -
@usr 但是阻塞调用意味着线程在调用期间变得无用。你在浪费资源。这很容易避免。怎么没毛病?
-
@dcastro 它所做的只是节省内存(主要是托管堆栈)。如果你有可用的内存,那么保存它的好处是零。
标签: c# multithreading task-parallel-library