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;
}