等待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个线程不受那个线程的影响