但是,如果我在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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)