Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the purpose of TaskCreationOptions with a TaskCompletionSource?

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;
}
like image 749
uzul Avatar asked Jan 15 '13 18:01

uzul


1 Answers

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);
like image 65
uzul Avatar answered Sep 27 '22 22:09

uzul