2014-02-27 52 views
-1

我有一個任務應該異步運行,但同步運行。Task.Result等待而不是繼續異步操作

我創建了一個任務:

var task = Task<int>.Factory.FromAsync(proxy.BeginSaveImage(sp, new AsyncCallback(CompleteSave), state), proxy.EndSaveImage); 

int res = task.Result; 

任務調用異步WCF服務。 WCF服務功能:

public IAsyncResult BeginSaveImage(statePackage sp, AsyncCallback callback, object state) 
    { 
     gStatePackage = sp; 

     // Create a task to do the work 
     var task = Task<int>.Factory.StartNew(this.SaveImage, state); 

     return task.ContinueWith(res => callback(task)); 
    } 

我在循環中運行任務。

我的問題是,當我運行它時,它不會並行運行,每次調用task.Results都會在繼續之前等待任務完成。

當我把任務代碼的函數SaveImageProcedure,並從這樣的循環中調用它:

Task.Factory.StartNew(() => 
{ 
    SaveImageProcedure(sp); 
}); 

它異步運行。我不想用另一個異步包裝器包裝異步調用。爲什麼使用task.Result的調用不會異步運行,我如何將其更改爲運行異步,而不像我一樣運行異步(或者運行異步,不等待結果並繼續運行),而是將其包裝爲運行異步?

我不需要任務返回值,也不介意得到它,但是代碼會繼續爲循環中的下一個迭代運行,而無需等待結果繼續。

回答

2

通過閱讀Result字段,您正在等待結果可用。 嘗試在Continue評估的結果,或使用await

我所期待的東西,看起來像(僞代碼):

var task = Task<int>... 
task.ContinueWith(result => { 
    if (result != expected) throw new Exception("..."); 
}); 

從本質上講,如果你正在做一個任務,你必須得到結果,你同步做這部分工作流程。 Taskasync只允許你在等待時做其他事情,他們不會做任何魔術。

+0

嗨伊恩,如何使用繼續,請你提供一個例子,所以我可以在實踐中嘗試它。謝謝 –

+0

@IdanShechter文檔告訴你你需要的一切http://msdn.microsoft.com/en-us/library/ee372288%28v=vs.110%29.aspx Google搜索查詢是'c#continuation'。 – Gusdor

+0

非常好,非常感謝。 –

0

我建議您閱讀我的async introMSDN article on best practices。特別是,使用await而不是ContinueWithResult

在服務器端,StartNew內部沒有任何意義。如果它只有同步工作,它應該只是同步執行。