在不使用Task.Run或TaskFactory.StartNew的情况下启动任务

时间:2015-03-26 13:01:50

标签: c# .net async-await task-parallel-library

让我们看看:

  

Task.Run方法(操作):将指定的工作排队以在ThreadPool上运行,并返回该工作的任务句柄。

  

TaskFactory.StartNew方法(操作):创建并启动任务。

但是我的代码没有其中任何一个。它仍然可以启动和运行。为什么呢?

static void Main(string[] args)
{
    Task t = AsynchronyWithTPL();
    t.Wait();
}

static Task AsynchronyWithTPL()
{
    Task<string> t = GetInfoAsync("Task 1");
    Task t2 = t.ContinueWith(task => Console.WriteLine(t.Result), TaskContinuationOptions.NotOnFaulted);
    Task t3 = t.ContinueWith(task => Console.WriteLine(t.Exception.InnerException), TaskContinuationOptions.NotOnFaulted);
    return Task.WhenAny(t2, t3);
}

似乎Task.Wait方法启动任务,但这是一个好习惯吗?

1 个答案:

答案 0 :(得分:2)

首先。 Task.Wait没有启动任务,等待任务完成。

您可以使用Task.RunTask.Factory.StartNewnew Task(...).Start()或致电async任务(我假设GetInfoAsync)来开始新任务。

async方法返回&#34; hot&#34;在该方法调用返回之前启动的任务。在您的情况下,您可以向该任务添加延续(t2t3),然后使用Task.WhenAny在两者之上创建延续。

如果您正在处理async任务,则无需启动任务(而且您没有)。如果您想将工作卸载到ThreadPool使用Task.Run。不要使用Task.Factory.StartNewnew Task(...).Start(),除非你必须(这应该是非常罕见的)。


我猜测(我可能错了)你打算写的是:

static async Task AsynchronyWithTPL()
{
    try
    {
        Console.WriteLine(await GetInfoAsync("Task 1"));    
    }
    catch (AggregateException exception)
    {
        Console.WriteLine(exception.InnerException);
    }
}