2012-12-04 121 views
2
var factory1 = new TaskFactory(); 
var task1 = factory1.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null).Result; 

上面的代碼工作在Windows 8和Windows應用商店,但是當我嘗試在Windows 8手機運行它,它不工作。它只是凍結,並沒有迴應任何事情,看起來像是永久運行任務。異步等待VS任務<T>。結果在WP8

我的目的是調用Web服務同步,而不使用asycn和等待方法。

+1

不要這樣做。它會凍結,並可能導致UI線程死鎖。 – SLaks

+0

這就是發生在我身上的事。但是有什麼辦法嗎? –

回答

6

我的目的是調用Web服務同步,而不使用asycn和等待方法。

你不應該那樣做。 WP8/Win8應該是異步的。 asyncawait使異步編程變得容易。

我有a blog post,詳細解釋了Result死鎖情況(雖然我有點驚訝它發生在這種情況下)。簡而言之,async方法正試圖在UI線程上恢復,但UI線程被阻塞,等待async方法完成。

你爲什麼要同步?

+0

:D我必須實現許多接口類的方法,我只是不想改變它的結構,因爲它是同步的 –

5

這是應該發生的。當你請求Result時,應用程序將停止並等待,直到你實際上得到的結果。這意味着你等待同步。

如果你想異步等待,你必須使用等待關鍵字,因爲它的語義是:當你得到的結果,然後執行下去;同時,繼續進行UI工作

這就是等待(隱含同步)和異步等待(又名等待)之間的區別。