2012-12-04 88 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工作

这就是等待(隐含同步)和异步等待(又名等待)之间的区别。