Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待2个方法而不是1个_C#_Asynchronous - Fatal编程技术网

C# 等待2个方法而不是1个

C# 等待2个方法而不是1个,c#,asynchronous,C#,Asynchronous,我正在尝试开始计数,然后另一种方法将通过生成1到6秒之间的随机数来停止计数。我可以进行计数,但stopper函数没有与Count函数异步启动。 我想让它们同时sart,所以我在同一个DoAsync方法中放了两个wait语句。但由于随机数是在计数结束时产生的,所以它并没有按预期工作。我需要在计数开始时开始生成 输出如下: 0 1. 2. 3. 4. 5. 6. 7. 8. 9 10 11 12 13 14 15 16 17 18 19 2126毫秒:计数将停止 using System; usin

我正在尝试开始计数,然后另一种方法将通过生成1到6秒之间的随机数来停止计数。我可以进行计数,但stopper函数没有与Count函数异步启动。 我想让它们同时sart,所以我在同一个DoAsync方法中放了两个wait语句。但由于随机数是在计数结束时产生的,所以它并没有按预期工作。我需要在计数开始时开始生成

输出如下:

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

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();
    }

}
使用系统;
使用系统线程;
使用System.Threading.Tasks;
命名空间控制台应用程序
{
班级计划
{
静态void Main(字符串[]参数)
{
CancellationTokenSource ctSource=新的CancellationTokenSource();
CancellationToken ctToken=ctSource.Token;
任务t1=DoAsync(ctSource,ctToken);
t1.等待();
}
专用静态异步任务DoAsync(CancellationTokenSource ctSource、CancellationToken ctoken)
{
如果(ctoken.IsCancellationRequested)
返回;
等待任务。运行(()=>Count(ctoken),ctoken);
等待任务。运行(()=>Stop(ctSource),ctoken);
}
公共静态无效计数(CancellationToken-ctoken)
{
对于(int i=0;i<20;i++)
{
如果(ctoken.IsCancellationRequested)
{
控制台写入线(“停在:“+i”);
打破
}
其他的
{
控制台写入线(i);
睡眠(150);
}
}
}
公共静态无效停止(CancellationTokenSource cSource)
{
随机r=新随机();
整数毫秒=r.Next(10006000);
WriteLine(“在“+毫秒+”毫秒内:“+”计数将停止…);
睡眠(毫秒);
cSource.Cancel();
}
}
}

您可以为此目的使用。它接受一组任务,并创建一个新任务,该任务将在所有源任务完成后完成

var taskCount = Task.Run(() => Count(ctoken), ctoken);
var taskStop = Task.Run(() => Stop(ctSource), ctoken);
await Task.WhenAll(new [] { taskCount, taskStop });
“我想让它们同时sart,所以我在同一个DoAsync方法中放了两个wait语句”——
wait
不会启动任务,它会中断方法的执行,直到任务完成。因此,您的代码专门等待第一个任务完成后再开始第二个任务。您希望同时启动这两个任务,然后等待WhenAll()从两个
task.Run()
方法调用中传递任务对象(保存在局部变量中)。有关更多详细信息,请参见标记的副本。