How to construct a Task without starting it?

2019-01-18 18:17发布

问题:

I want to use this Task<> constructor. I can't seem to get the sntax right can someone correct my code.

Also, am I right thinking that if a Task is constructed that way, it's not started?

The constructor I think I need:

Task<TResult>(Func<Object, TResult>, Object)

My code erroring:

Argument 1: cannot convert from 'method group' to 'System.Func<object,int>'

static void Main(string[] args)
{
    var t = new Task<int>(GetIntAsync, "3"); //error is on this line
    ...
}

static async Task<int> GetIntAsync(string callerThreadId)
{
    ...
    return someInt;
}

回答1:

var t = new Task<int>(() => GetIntAsync("3").Result);

Or

var t = new Task<int>((ob) => GetIntAsync((string) ob).Result, "3");

To avoid using lambda, you need to write a static method like this:

private static int GetInt(object state)
{
   return GetIntAsync(((string) state)).Result;
}

And then:

var t = new Task<int>(GetInt, "3");


回答2:

   //creating task
   var yourTask = Task<int>.Factory.StartNew(() => GetIntAsync("3").Result);

   //...

   int result = yourTask.Result;

UPDATE:

Yes, unfortunately it does start the task. Use code as mentioned above instead:

   //creating task
   var yourTask = new Task<int>(() => GetIntAsync("3").Result);

   //...

   // call task when you want
   int result = yourTask.Start();