【发布时间】:2012-03-24 21:18:46
【问题描述】:
我刚刚意识到,当我从一个任务中启动一个任务并调用 Task.Wait 时,新任务将不会被内联,而调用 Task.Result 将始终内联任务。
当我们使用 RAII 模式(在 ExecuteWithCancel 中实现)包装我们的任务时,内联将重用分配的资源并且是可取的。
但我们有时想等待一段时间并在此之后取消任务。 等待代码如下:
using (var cts = new CancellationTokenSource())
{
// Task scheduler decides whether to execute synchronous or asynchronous
var task = new Task<TResult>(() => ExecuteWithCancel<TResult>(cts.Token, nameOfTaskPerformer, arguments), cts.Token)
if (timeout==TimeSpan.Zero || task.Wait(timeout)) // this creates an all or nothing timeout
return task.Result;
cts.Cancel();
throw new TimeoutException("");
}
当超时为TimeSpan.Zero时,任务被内联,否则它总是使用另一个线程。
是否有一种简单的方法可以重新设计此代码以使用内联和等待/超时?
【问题讨论】:
-
您当前的代码永远不会启动任务。要么调用'task.Start',要么使用
Task.Factory.StartNew。见blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
标签: c# .net task-parallel-library