当前位置: 首页 > 知识库问答 >
问题:

C#链接ContinueWith不等待上一个任务完成

仲柏
2023-03-14
public async Task<int> SampleAsyncMethodAsync(int number,string id)
  {
            Console.WriteLine($"Started work for {id}.{number}");
            ConcurrentBag<int> abc = new ConcurrentBag<int>();

            await Task.Run(() => { for (int count = 0; count < 30; count++) { Console.WriteLine($"[{id}] Run: {number}"); abc.Add(count); } });

            Console.WriteLine($"Completed work for {id}.{number}");
            return abc.Sum();
        }
        [Test]
        public void TestAsyncWaitForPreviousTask()
        {
            for (int count = 0; count < 3; count++)
            {
                int scopeCount = count;

                var c = SampleAsyncMethodAsync(0, scopeCount.ToString())
                .ContinueWith((prevTask) =>
                {
                    return SampleAsyncMethodAsync(1, scopeCount.ToString());
                })
                .ContinueWith((prevTask2) =>
                {
                    return SampleAsyncMethodAsync(2, scopeCount.ToString());
                });
            }
        }
[2] Run: 0
[2] Run: 0
[2] Run: 0
Completed work for 2.0
Started work for 0.1
Started work for 0.2  <-- surprise!
[0] Run: 2
[0] Run: 2
[0] Run: 2
[0] Run: 2
[0] Run: 2

共有1个答案

马天逸
2023-03-14

简而言之,您希望ContinueWith等待以前返回的对象。在continueWith操作中返回对象(甚至是任务)不会对返回的值产生任何影响,它不会等待它完成,而是返回它,并在存在时传递给continuation。

下面的事情确实发生了:

>

  • 运行SampleSyncMethodAsync(0,scopeCount.ToString())
  • 完成后,执行continuation 1:

    return SampleAsyncMethodAsync(1, scopeCount.ToString());
    
    for (int count = 0; count < 3; count++)
    {
        int scopeCount = count;
    
        var c = SampleAsyncMethodAsync(0, scopeCount.ToString())
        .ContinueWith((prevTask) =>
        {
            SampleAsyncMethodAsync(1, scopeCount.ToString()).Wait();
        })
        .ContinueWith((prevTask2) =>
        {
            SampleAsyncMethodAsync(2, scopeCount.ToString()).Wait();
        });
    }    
    

    此外,您还可以执行以下操作:

    for (int count = 0; count < 3; count++)
    {
        int scopeCount = count;
    
        var c = SampleAsyncMethodAsync(0, scopeCount.ToString())
            .ContinueWith((prevTask) =>
            {
                SampleAsyncMethodAsync(1, scopeCount.ToString())
                    .ContinueWith((prevTask2) =>
                    {
                        SampleAsyncMethodAsync(2, scopeCount.ToString());
                    });
            });   
    }
    

    然而,它创造了某种回调地狱,看起来很混乱。

    您可以使用await使这段代码更加简洁:

    for (int count = 0; count < 3; count++)
    {
        int scopeCount = count;
    
        var d = Task.Run(async () => {
            await SampleAsyncMethodAsync(0, scopeCount.ToString());
            await SampleAsyncMethodAsync(1, scopeCount.ToString());
            await SampleAsyncMethodAsync(2, scopeCount.ToString());
        });
    }   
    

  •  类似资料:
    • 我想哭我的日程安排,直到我的任务完成。如果有时间执行第二个计划,则必须等到上一个任务尚未完成。我在java启动应用程序中使用@Schedule。我想每5分钟向数据库中插入一次数据,但我想保留我的时间表,直到插入的数据还没有完成,还有时间进行第二次执行。演示代码

    • 问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。

    • 我的makefile中的一个目标是一个非常耗时的CPU任务。但是我可以分割工作负载并并行运行任务几次,以加快整个过程。 我的问题是make不会等待所有过程完成。 考虑一下这个简单的脚本,名为“代码> MyTask.SH <代码>: 现在,让我们从bash脚本调用它,并使用等待所有任务完成: 产出如预期: 但是在Makefile中尝试相同的方法时: 它不起作用: 当然,我可以创建多个目标,这些目标可

    • 问题内容: 等待所有任务完成的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: 实现可运行。这似乎是正确执行的任务,但代码崩溃上用。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西 问题答案: 最简单的方法是使用单行代码执行所需的操作。用你的话来说,你需要修改或包装以实

    • 我正在运行的服务器应用程序获取我要使用任务系统处理的多个任务请求。 每个任务都表示为一个可运行的线程池,该线程池中的线程数小于或等于线程池的大小,需要线程池中的线程数。当然,线程池是必要的,以避免CPU因线程过多而过载。 然而,其中一些任务可以是多线程的,而另一些则不能。这就是为什么一个任务可能需要等待其所有特定线程完成,以便合并这些线程的结果以获得最终结果的原因。 如果使用多个实例,则可以像这样

    • 在C#中,我有以下两个简单的例子: 第一个示例创建一个打印“开始”的任务,等待5秒钟打印“完成”,然后结束任务。我等待任务完成,然后打印“全部完成”。当我运行测试时,它会按预期运行。 第二个测试应该具有相同的行为,只是由于使用了async和Wait,任务内部的等待应该是非阻塞的。但是这个测试只打印“开始”,然后立即打印“全部完成”和“完成”,永远不会打印。 我不知道我为什么会有这样的行为:S非常感