[英]Is Task.Run or TaskFactory.StartNew always inappropriate to use in async methods?
[英]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.Run
, Task.Factory.StartNew
, new Task(...).Start()
或调用async
任务(假定我为GetInfoAsync
)来启动新任务。
async
方法返回一个“热”任务,该任务在该方法调用返回之前已启动。 在您的情况下,您可以向该任务添加延续( t2
, t3
),然后使用Task.WhenAny
在两者之上创建一个延续。
如果您要处理async
任务,则无需启动任务(也不必启动)。 如果要将工作Task.Run
到ThreadPool
使用Task.Run
。 除非必须使用, Task.Factory.StartNew
不要使用Task.Factory.StartNew
或new 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.