使用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);