xamarin.android – 在PCL中使用Mono Droid的Microsoft.bcl.async?

xamarin.android – 在PCL中使用Mono Droid的Microsoft.bcl.async?,第1张

概述我有一个针对Profile158的便携式类库(PCL)( Windows应用商店,.NET 4.5,Silverlight 5,Windows Phone 8).我可以轻松地使用返回一种Task类型的方法,并且它都可以像我期望的那样工作.每当我访问Result属性时,它就会完成运行异步代码并返回结果. 但是,如果我在PCL中的方法中使用async / await关键字,我会得到一个任务.但是,当我 我有一个针对Profile158的便携式类库(PCL)( Windows应用商店,.NET 4.5,Silverlight 5,windows Phone 8).我可以轻松地使用返回一种Task类型的方法,并且它都可以像我期望的那样工作.每当我访问Result属性时,它就会完成运行异步代码并返回结果.

但是,如果我在PCL中的方法中使用async / await关键字,我会得到一个任务.但是,当我尝试访问Result属性时,它会阻塞并永远不会返回.

在两种情况下查看Visual Studio中的调试输出窗口,我看到相同的文本:

Thread started: Thread started: Loaded assembly: Mono.Security.dll [External]Thread started: Thread started:

所以看起来好像代码正在运行,但它永远不会返回到UI线程.有没有其他人试图在PCL中使用带有Microsoft.bcl.async的PCL?

我的Mono DroID项目针对的是AndroID 2.1.

谢谢,
– 约翰

更新:
以下是有关不同方案的一些其他信息.首先,这里是在UI代码中编写时可以在Mono DroID上运行的代码:

var task = request.GetResponseAsync();string HTML = task.Result.GetResponseText();

然后我在PCL中创建了以下方法:

public async Task<string> test(){    IhttpResponse responce = await GetResponseAsync();    return responce.GetResponseText();}

并使用Mono UI代码中的代码调用它:

string HTML = request.test().Result;

它永远不会回归……

解决方法 正如我在博客中描述的那样,这是一个 classic deadlock scenario.

默认情况下,await将捕获“上下文”并使用它来恢复异步方法.这个“上下文”是当前的SynchronizationContext,除非它是null,在这种情况下它是当前的TaskScheduler.

因此,您从UI线程(提供SynchronizationContext)调用异步方法,然后通过调用Result来阻止UI线程.异步方法无法完成,因为它正在尝试在被阻止的UI线程上完成.

要解决此问题,请遵循以下准则:

>一直使用async.不要调用结果或等待从异步方法返回的任务;请改用.
>尽可能在库代码中使用ConfigureAwait(false).

您可能还会发现我的async/await intro很有帮助.

总结

以上是内存溢出为你收集整理的xamarin.android – 在PCL中使用Mono Droid的Microsoft.bcl.async?全部内容,希望文章能够帮你解决xamarin.android – 在PCL中使用Mono Droid的Microsoft.bcl.async?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1140756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存