gpt4 book ai didi

c# - ContinueWith 链接未按预期工作

转载 作者:太空狗 更新时间:2023-10-29 22:22:23 24 4
gpt4 key购买 nike

我有这个示例代码:

    static void Main(string[] args) {
var t1 = Task.Run(async () => {
Console.WriteLine("Putting in fake processing 1.");
await Task.Delay(300);
Console.WriteLine("Fake processing finished 1. ");
});
var t2 = t1.ContinueWith(async (c) => {
Console.WriteLine("Putting in fake processing 2.");
await Task.Delay(200);
Console.WriteLine("Fake processing finished 2.");
});
var t3 = t2.ContinueWith(async (c) => {
Console.WriteLine("Putting in fake processing 3.");
await Task.Delay(100);
Console.WriteLine("Fake processing finished 3.");
});
Console.ReadLine();
}

控制台输出让我感到困惑:

  • 放入虚假处理 1.
  • 伪造处理完成1.
  • 进行假加工2.
  • 进行虚假处理 3.
  • 伪造处理完成3.
  • 伪造处理完成2.

我正在尝试链接任务,以便它们一个接一个地执行,我做错了什么?而且我不能使用 await,这只是示例代码,实际上我正在排队传入的任务(有些是异步的,有些不是)并希望按照它们进来的相同顺序执行它们但没有并行性,ContinueWith 似乎比创建更好一个 ConcurrentQueue 并自己处理所有事情,但它就是行不通......

最佳答案

看看 t2 的类型.这是一个Task<Task> . t2将完成当它完成开始执行实际工作的任务时而不是当该工作实际完成时。

要使其正常工作,对代码的最小更改是添加一个 unwrap。在您第二次和第三次调用 ContinueWith 之后, 这样你就得到了代表你工作完成的任务。

更惯用的解决方案是简单地删除 ContinueWith完全调用并只使用 await向任务添加延续。

有趣的是,您会看到 t1 的相同行为如果你使用 Task.Factory.StartNew ,但是Task.Run专门设计用于 async lambdas 并实际上在内部解包所有 Action<Task>委托(delegate)返回返回任务的结果,而不是表示开始该任务的任务,这就是为什么您不需要解包该任务。

关于c# - ContinueWith 链接未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25690770/

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