等待2个方法而不是1个[重复]

Posted

技术标签:

【中文标题】等待2个方法而不是1个[重复]【英文标题】:awaiting 2 methods instead of 1 [duplicate] 【发布时间】:2018-04-27 03:20:11 【问题描述】:

我正在尝试开始计数,然后另一种方法将通过生成 1 到 6 秒之间的随机数来停止计数。我可以进行计数,但停止功能没有与我的计数功能异步启动。 我希望他们两个同时 sart,所以我将两个 await 语句放在同一个 DoAsync 方法中。但它不能按预期工作,因为在计数结束时会生成随机数。我需要在计数开始时开始生成...

输出是这样的:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 In2126 毫秒:计数将停止...

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication

class Program

    static void Main(string[] args)
    
        CancellationTokenSource ctSource = new CancellationTokenSource();
        CancellationToken ctToken = ctSource.Token;

        Task t1 = DoAsync(ctSource, ctToken);

        t1.Wait();
    

    private static async Task DoAsync(CancellationTokenSource ctSource, CancellationToken ctoken)
    
        if (ctoken.IsCancellationRequested)
            return;

        await Task.Run(() => Count(ctoken), ctoken);
        await Task.Run(() => Stop(ctSource), ctoken);
    

    public static void Count(CancellationToken ctoken)
    
        for (int i = 0; i < 20; i++)
        
            if (ctoken.IsCancellationRequested)
            
                Console.WriteLine("stopped at :" + i);

                break;
            
            else
            
                Console.WriteLine(i);
                Thread.Sleep(150);
            
        
    

    public static void Stop(CancellationTokenSource cSource)
    
        Random r = new Random();
        int milliseconds = r.Next(1000, 6000);
        Console.WriteLine("In" + milliseconds + "  milliseconds: " + "count will stop...");

        Thread.Sleep(milliseconds);
        cSource.Cancel();
    


【问题讨论】:

" 我希望它们同时启动,所以我将两个 await 语句放在同一个 DoAsync 方法中" -- await 不会启动任务,它会中断方法的执行,直到任务完成。因此,您的代码专门等到第一个任务完成后再开始第二个任务。您希望同时启动两个 await WhenAll(),然后从两个 Task.Run() 方法调用中传递任务对象(保存在局部变量中)。有关更多详细信息,请参阅标记的重复项。 【参考方案1】:

您可以为此目的使用Task.WhenAll()。它接受一系列任务并创建一个新任务,该任务将在所有源任务完成后完成。

var taskCount = Task.Run(() => Count(ctoken), ctoken);
var taskStop = Task.Run(() => Stop(ctSource), ctoken);
await Task.WhenAll(new []  taskCount, taskStop );

【讨论】:

以上是关于等待2个方法而不是1个[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java线程池5个线程同时运行 有一个线程等待数秒无法继续运行被结束掉,而其他4个线程不受那个线程的影响

使用 Task.WaitAll 方法而不是 await 关键字[重复]

在赛普拉斯的 for 循环中等待异步方法

打印随机字符而不是相同的字符[重复]

Java中的锁

从2个numpy向量生成数字对数组[重复]