让我们看看:
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
方法启动任务,但这是一个好习惯吗?
答案 0 :(得分:2)
首先。 Task.Wait
没有启动任务,等待任务完成。
您可以使用Task.Run
,Task.Factory.StartNew
,new Task(...).Start()
或致电async
任务(我假设GetInfoAsync
)来开始新任务。
async
方法返回&#34; hot&#34;在该方法调用返回之前启动的任务。在您的情况下,您可以向该任务添加延续(t2
,t3
),然后使用Task.WhenAny
在两者之上创建延续。
如果您正在处理async
任务,则无需启动任务(而且您没有)。如果您想将工作卸载到ThreadPool
使用Task.Run
。不要使用Task.Factory.StartNew
或new Task(...).Start()
,除非你必须(这应该是非常罕见的)。
我猜测(我可能错了)你打算写的是:
static async Task AsynchronyWithTPL()
{
try
{
Console.WriteLine(await GetInfoAsync("Task 1"));
}
catch (AggregateException exception)
{
Console.WriteLine(exception.InnerException);
}
}