2013-12-09 95 views
0

我試圖在WP上同步運行基於任務的異步方法。從here讀取代碼後。我成功地做到了,同步地從系統庫調用異步方法在WP8上同步運行基於任務的異步方法

但是,沒有針對每個API的任務庫異步方法,特別是在WP中,如WebRequest.BeginGetResponse。所以我寫了一個包,如:

Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, 
     request.EndGetResponse, null); 

而且,什麼是具有諷刺意味,當我嘗試從UI線程同步調用它(有點STANGE我只是做一個測試?),我的計劃是在堅持 request.BeginGetResponse,永遠不要繼續。

但是爲什麼?我使用相同的代碼來調用系統API和我的方法。我的代碼有錯嗎?或其他的東西?

非常感謝您的幫助!

回答

1

您可能會遇到deadlock situation I describe on my blog,其中async方法嘗試在UI線程被阻止時恢復UI線程。

最好的解決方案是使用「async一路」 - 即將您的同步調用方法更改爲異步。

+0

是的,你是對的,非常感謝你。事實上,我發現異步和UI的情況是非常危險的新人。我將在未來的發展中遵循您的建議,非常感謝! –

1

你需要調用Task.Start這樣的:

var requestTask = Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, 
     request.EndGetResponse, null); 

如果你希望它是synchonous(我用這個詞輕輕地,因爲它不是真正同步),那麼你可以等待任務。

Task.Wait(requestTask); 

我還建議你考慮加入Async Nuget Package然後你可以異步並等待這個任務。