Question

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;
}
Was it helpful?

Solution

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:

new TaskCompletionSource<WebResponse>(TaskCreationOptions.LongRunning);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top