亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

并行運行兩個異步任務并在.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 關注
  • 379 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號