【问题标题】:Start a task without the use of Task.Run or TaskFactory.StartNew在不使用 Task.Run 或 TaskFactory.StartNew 的情况下启动任务
【发布时间】:2015-03-27 05:03:04
【问题描述】:

让我们看看:

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 方法启动了任务,但这是一个好习惯吗?

【问题讨论】:

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


    【解决方案1】:

    首先。 Task.Wait 不启动任务,它等待任务完成。

    您可以使用Task.RunTask.Factory.StartNewnew Task(...).Start() 或调用async 任务(我假设GetInfoAsync 是)来启动新任务。

    async 方法返回在该方法调用返回之前启动的“热”任务。在您的情况下,您向该任务添加延续(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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      相关资源
      最近更新 更多