我对TaskCompletionSource<>
的内部工作有些不清楚。
当使用Task<>
创建简单的Factory
时,我希望此任务在线程池中排队,除非我指定了TaskCreationOptions.LongRunning
,否则它将在新线程中运行。
我对TaskCompletionSource
的理解是,我负责在任务结束或失败时触发,并且完全控制如何管理线程。
但是,TaskCompletionSource
的cTor允许我指定一个TaskCreationOptions
,这使我感到困惑,因为我预期Scheduler
不能处理任务本身。
在TaskCreationOptions
上下文中TaskCompletionSource<>
的目的是什么?
下面是一个使用示例:
public Task<WebResponse> Download(string url)
{
TaskCompletionSource<WebResponse> tcs =
new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);
var client = (HttpWebRequest)HttpWebRequest.Create(url);
var async = client.BeginGetResponse(o =>
{
try
{
WebResponse resp = client.EndGetResponse(o);
tcs.SetResult(resp);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
}, null);
return tcs.Task;
}
最佳答案
答案是,TaskCurrestOp选项只对附件的选项有用,因为TaskCuleTyOnStand可以是任何其他任务的子对象。
与线程管理或执行顺序相关的选项与taskCompletionSource上下文无关。以下代码实际上抛出了一个异常:
new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);