等待2种方法而不是1种方法

时间:2017-11-14 08:52:49

标签: c# asynchronous

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

输出如下:

0 1 2 3 4 五 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();
    }

}

}

1 个答案:

答案 0 :(得分:2)

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

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