我剛剛意識到,當我從任務內啓動任務並調用Task.Wait
時,新任務不會被內聯,而調用Task.Result將始終內聯任務。任務內聯和Task.Wait
當我們用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'。請參閱http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx –