繁体   English   中英

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

[英]Start a task without the use of Task.Run or TaskFactory.StartNew

让我们来看看:

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

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

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

async方法返回一个“热”任务,该任务在该方法调用返回之前已启动。 在您的情况下,您可以向该任务添加延续( t2t3 ),然后使用Task.WhenAny在两者之上创建一个延续。

如果您要处理async任务,则无需启动任务(也不必启动)。 如果要将工作Task.RunThreadPool使用Task.Run 除非必须使用, Task.Factory.StartNew不要使用Task.Factory.StartNewnew Task(...).Start()除非如此)。


我猜(我可能错了),你的意思是这样写的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM