为了账号安全,请及时绑定邮箱和手机立即绑定

并行运行两个异步任务并在.NET 4.5中收集结果

并行运行两个异步任务并在.NET 4.5中收集结果

C#
素胚勾勒不出你 2019-08-17 15:50:27
并行运行两个异步任务并在.NET 4.5中收集结果我已经尝试了一段时间来获得我认为可以简单地使用.NET 4.5的东西我想同时启动两个长时间运行的任务,并以最佳的C#4.5(RTM)方式收集结果以下作品,但我不喜欢它,因为:我想Sleep成为一个异步方法,所以它可以是await其他方法它看起来很笨拙 Task.Run()我认为这甚至根本不使用任何新的语言功能!工作代码:public static void Go(){     Console.WriteLine("Starting");     var task1 = Task.Run(() => Sleep(5000));         var task2 = Task.Run(() => Sleep(3000));     int totalSlept = task1.Result + task2.Result;     Console.WriteLine("Slept for a total of " + totalSlept + " ms");}private static int Sleep(int ms){     Console.WriteLine("Sleeping for " + ms);     Thread.Sleep(ms);     Console.WriteLine("Sleeping for " + ms + " FINISHED");     return ms;}非工作代码:更新:这实际上是有效的,并且是正确的方法,唯一的问题是 Thread.Sleep此代码不起作用,因为调用Sleep(5000)立即启动任务运行,因此Sleep(1000)在完成之前不会运行。这是真的,即使Sleep是async,我不是太快使用await或打电话.Result。我想也许有一种方法可以Task<T>通过调用方法来获得非运行,async这样我就可以调用Start()这两个任务,但我无法弄清楚如何Task<T>通过调用异步方法来获取。public static void Go(){     Console.WriteLine("Starting");     var task1 = Sleep(5000);    // blocks     var task2 = Sleep(1000);     int totalSlept = task1.Result + task2.Result;     Console.WriteLine("Slept for " + totalSlept + " ms");}private static async Task<int> Sleep(int ms){     Console.WriteLine("Sleeping for " + ms);     Thread.Sleep(ms);     return ms;}
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

async Task<int> LongTask1() { ... }

async Task<int> LongTask2() { ... }

...

{

   Task<int> t1 = LongTask1();

   Task<int> t2 = LongTask2();

   await Task.WhenAll(t1,t2);

   //now we have t1.Result and t2.Result

}


查看完整回答
反对 回复 2019-08-17
?
手掌心

TA贡献1942条经验 获得超3个赞

虽然你的Sleep方法是异步的,但Thread.Sleep不是。异步的整个想法是重用单个线程,而不是启动多个线程。因为您已使用对Thread.Sleep的同步调用阻止,所以它无法正常工作。

我假设这Thread.Sleep是你想要做的简化。您的实际实现可以编码为异步方法吗?

如果您确实需要运行多个同步阻塞调用,请查看我认为的其他地方!


查看完整回答
反对 回复 2019-08-17
  • 3 回答
  • 0 关注
  • 341 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信