gpt4 book ai didi

c# - 在方法上使用 await Task.Factory.StartNew 将立即返回

转载 作者:行者123 更新时间:2023-11-30 13:53:55 24 4
gpt4 key购买 nike

我正在运行以下代码(C#7.1 控制台应用程序),但我无法真正理解行为差异的原因。

如果我等待常规异步方法调用或 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.Factory.StartNew(MethodThatReturnsTask)你会得到一个 Task<Task<T>>Task<Task>取决于该方法是否返回通用任务。

最终结果是你有 2 个任务:

  1. Task.Factory.StartNew生成一个调用 MethodThatReturnsTask 的任务, 让我们称这个任务为“任务 A”
  2. MethodThatReturnsTask在你的情况下返回 Task ,我们称之为“任务 B”,这意味着 StartNew 的过载使用处理此问题的,最终结果是您返回包装任务 B 的任务 A。

“正确”等待这些任务需要 2 个等待,而不是 1 个。您的单个等待只是等待任务 A,这意味着当它返回时,任务 B 仍在执行等待完成。

要天真地回答您的问题,请使用 2 个等待:

await await Task.Factory.StartNew(DisplayCurrentInfo);

但是,值得怀疑的是,为什么您需要生成一个任务来启动另一个异步方法。相反,你最好使用第二种语法,你只需等待方法:

await DisplayCurrentInfo();

意见如下:一般来说,一旦您开始编写异步代码,使用 Task.Factory.StartNew或其任何同级方法应保留,以便在您需要生成一个线程(或类似的东西)来调用非异步的东西时使用。如果您不需要此特定模式,最好不要使用它。

关于c# - 在方法上使用 await Task.Factory.StartNew 将立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50982505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com