2014-10-08 72 views
1

我有一個WPF項目下面的異步方法:更新綁定值aynchronously

private async void RecalculateRun(Guid run_number) 
{ 
    // kick off the Full recalculation 
    // 
    await FullRecalcAsync(run_number); 

    // When thats done, asyncronously kick off a refresh 
    // 
    Task RefreshTask = new Task(() => RefreshResults()); 
    await RefreshTask;  
} 

第一await確實計算的負載和第二取結果,並更新一些結合變量。我並不期待在第二個await期間更新UI,但我期待在完成時這樣做。當然,這不會發生。另外,我想指出的是,如果我在第一個await後同步呼叫RefreshTask,那麼它工作正常。

+1

['異步void'應該只在事件處理程序中使用(http://msdn.microsoft.com/en-us/magazine/jj991977。 aspx)和'RecalculateRun'看起來不像一個。 – svick 2014-10-08 18:11:40

回答

3

您正在創建一個任務而不啓動它。你需要調用Start

Task RefreshTask = new Task(() => RefreshResults()); 
RefreshTask.Start(); 
await RefreshTask; 

或者最好使用Task.Run

await Task.Run(() => RefreshResults()); 

使用Task直接構造通常氣餒:

一般來說,我總是建議使用Task.Factory.StartNew,除非特殊的情況提供了一個令人信服的理由,使用構造函數後跟Start。我推薦這個的原因有幾個。其一,它通常是更有效的

"Task.Factory.StartNew" vs "new Task(...).Start"