使用TaskCompletionSource的TaskCreationOptions的目的是什么?
关于TaskCompletionSource
的内部工作原理,我有些不清楚。
当使用Factory
创建一个简单的Task
,我希望这个任务在一个线程池中排队,除非我指定TaskCreationOptions.LongRunning
,它将在一个新线程中运行。
我对TaskCompletionSource
理解是,我负责在任务结束或失败时触发,并且我完全控制如何管理线程。 然而, TaskCompletionSource
的ctor允许我指定一个TaskCreationOptions
,这让我感到困惑,因为我期望Scheduler
无法自己处理任务。
在TaskCompletionSource
的上下文中TaskCompletionSource
的目的是什么?
这是一个使用示例:
public Task Download(string url) { TaskCompletionSource tcs = new TaskCompletionSource(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; }
答案是TaskCreationOption仅对其AttachToParent选项有用,因为TaskCompletionSource可以是任何其他任务的子代。 与线程管理或执行顺序相关的选项与TaskCompletionSource的上下文无关。 以下代码实际上抛出exception:
new TaskCompletionSource(TaskCreationOptions.LongRunning);