并行運行兩個異步任務并在.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
}
手掌心
TA貢獻1942條經驗 獲得超3個贊
雖然你的Sleep方法是異步的,但Thread.Sleep不是。異步的整個想法是重用單個線程,而不是啟動多個線程。因為您已使用對Thread.Sleep的同步調用阻止,所以它無法正常工作。
我假設這Thread.Sleep是你想要做的簡化。您的實際實現可以編碼為異步方法嗎?
如果您確實需要運行多個同步阻塞調用,請查看我認為的其他地方!
- 3 回答
- 0 關注
- 379 瀏覽
添加回答
舉報
0/150
提交
取消
