我正在运行以下代码(C#7.1控制台应用程序),但我无法真正理解为什么会有不同的行为。
如果我等待常规异步方法调用或Task.Run,则它将按预期工作(即应用程序不会立即返回)。但是,如果我使用Task.Factory.StartNew,则它将立即返回而不实际运行代码。
奇怪的是 - 如果我在方法中使用StartNew但删除await,则它将不会立即返回...
问题:这会立即返回:
奇怪:这也不会立即返回:
如果我等待常规异步方法调用或Task.Run,则它将按预期工作(即应用程序不会立即返回)。但是,如果我使用Task.Factory.StartNew,则它将立即返回而不实际运行代码。
奇怪的是 - 如果我在方法中使用StartNew但删除await,则它将不会立即返回...
问题:这会立即返回:
static async Task Main(string[] args)
{
await Task.Factory.StartNew(DisplayCurrentInfo);
}
static async Task DisplayCurrentInfo()
{
await WaitAndApologize();
Console.WriteLine($"The current time is {DateTime.Now.TimeOfDay:t}");
Thread.Sleep(3000);
}
即 - 我将无法看到任何打印到控制台的内容,而且控制台已经被关闭。
没问题:这不会立即返回:
static async Task Main(string[] args)
{
await DisplayCurrentInfo(); // or await Task.Run(DisplayCurrentInfo);
}
static async Task DisplayCurrentInfo()
{
await WaitAndApologize();
Console.WriteLine($"The current time is {DateTime.Now.TimeOfDay:t}");
Thread.Sleep(3000);
}
奇怪:这也不会立即返回:
static async Task Main(string[] args)
{
await Task.Factory.StartNew(DisplayCurrentInfo);
}
static async Task DisplayCurrentInfo()
{
WaitAndApologize();
Console.WriteLine($"The current time is {DateTime.Now.TimeOfDay:t}");
Thread.Sleep(3000);
}
等待并道歉:
static async Task WaitAndApologize()
{
// Task.Delay is a placeholder for actual work.
await Task.Delay(2000);
// Task.Delay delays the following line by two seconds.
Console.WriteLine("\nSorry for the delay. . . .\n");
}
Task.Run
创建一个名为 A 的任务,目的是创建另一个任务 B,然后你在等待 A,但没有等待 B。除非你知道如何正确地执行此操作,请不要使用该调用语法,只需使用有效的方法。 - Lasse V. Karlsenawait await Task.Factory....
,但是一个更好的解决方案是只使用await DisplayCurrentInfo();
。 - Lasse V. Karlsenasync
代码,任何通过Run
或StartNew
手动构建Task
的方式都可能是可疑的。你的async
方法已经创建了Task
- 为什么还需要更多的呢? - Damien_The_Unbelieverawait X
将给出一个新表达式,如果这个表达式是具有等待器的东西,那么你也可以等待它,如此无限循环。任务内嵌。 - Lasse V. Karlsen