2016-12-30 254 views
-4

我想在for循環中執行一些操作並使用'await Task.Delay()'。 但我總是空的,它應該返回10爲什麼異步任務<TResult>總是返回空值

public class Test { 
    public async Task<int> test() { 
     int sum=0; 
     for (int i = 0; i < 10; i++) { 
      System.Diagnostics.Debug.Write("start loop"); 
      sum++; 
      await Task.Delay(1000); 
      System.Diagnostics.Debug.Write("finish loop"); 
     } 
     return sum; 
    } 
} 

//主

Test test = new Test() 
var test1 = test.test().Result; 
+0

您在檢查/打印值之前是否等待它? – FCin

+3

什麼是空的?我不明白。你的意思是它返回零嗎?另外,它將如何達到55,數學不會加起來。 –

+3

請說明你是怎麼稱呼這個的,我猜你不會等待任務完成。加上你的代碼的預期結果是10,而不是55.如果你想55'sum ++;'改變爲'sum + = i;' –

回答

0

您的問題似乎是在等待test().Result導致死鎖。原因是,這條線

await Task.Delay(1000); 

返回執行流程給調用者,然後調用test().Result等待完成任務。所以你的主線程阻塞。

上述行中的await嘗試在Task.Delay()完成時恢復執行test。但是默認情況下,它會嘗試在您的調用線程上恢復執行。是的,當前被阻止的線程,因爲它等待Result

一種解決方案可能更改行:

await Task.Delay(1000).ConfigureAwait(false); 

這將導致await不再嘗試恢復原線,但任何其他的。這樣你可以避免死鎖,你的程序應該繼續。

+0

謝謝!但這意味着我需要爲每個Task.Delay添加'ConfigureAwait(false)',對吧? – LittleTin

+0

@LittleTin我想細節取決於你的真實代碼。我想這足以將它追加到'test()'中的第一個'await'ed調用,因爲之後你已經在另一個線程中了。 –

0

Await確保當前異步方法中的其餘代碼在等待完成後才執行。 在控制檯應用程序中,沒有專門的SynchronizationContext;這意味着您的延續將在線程池線程上運行。Test方法將控制權返回到Main,它只會繼續執行。

 var t = new Test(); 
     t.test().Wait(); 
     Console.WriteLine(t.test().Result);//output is 10 
相關問題