There's something unclear to me about the inner workings of TaskCompletionSource<>
.
When creating a simple Task<>
using the Factory
, I expect this task to be enqueued in a thread pool, unless I specify TaskCreationOptions.LongRunning
, where it will run in a new thread instead.
My understanding of TaskCompletionSource
, is that I am responsible of triggering when a task ends, or fails, and I have full control on how to manage threads.
However, the ctor of TaskCompletionSource
allows me to specify a TaskCreationOptions
, and this confuse me, since I was expecting the Scheduler
not being able to handle the task itself.
What is the purpose of TaskCreationOptions
in the context of a TaskCompletionSource<>
?
Here is an example of use:
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;
}
The answer is that a TaskCreationOption is useful for its AttachToParent option only, as TaskCompletionSource can be the child of any other task. Options related to thread management or execution ordering aren't relevant in the context of a TaskCompletionSource. The following code actually throws an exception: