【发布时间】:2013-01-31 17:37:40
【问题描述】:
我有一个针对 Profile158(Windows Store、.NET 4.5、Silverlight 5、Windows Phone 8)的可移植类库 (PCL)。我可以轻松地使用返回一种任务类型的方法,并且一切都按我的预期工作。每当我访问 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;
它永远不会回来......
【问题讨论】:
-
如果您使用 Result 属性,它将阻塞直到任务完成。如果您从任务本身需要执行的同一个线程执行此操作,那么您基本上已经给自己一个死锁。目前还不清楚你的代码做了什么……你有一个简短但完整的程序来演示这个问题吗?
-
@dsplaisted 在 BUILD 的演示中使用了 MonoDroid 这一层 - channel9.msdn.com/Events/Build/2012/3-004 - 我将在这篇文章中添加 PCL 标签并发出蝙蝠信号 - 他将在雷德蒙德时间陪伴...
-
与您的问题无关,但 Microsoft.Bcl.Async 仍处于测试阶段。应避免在任何生产代码中使用它。当然,您现在可能只是在测试它。
-
我不是律师,所以请阅读许可证并自行决定,但我相信 Microsoft.Bcl.Async 的许可证将允许您在生产中使用它(我想您会称之为“上线”许可证)。风险是否值得由您决定。但是,它实际上没有许可用于非 Windows 平台。因此,您可以针对它编译您的可移植库,但是当它实际在 Android 上运行时,您将需要不同的实现。在我的 BUILD 演示中,我通过调整 AsyncBridge 代码来做到这一点。
-
你不应该使用配置文件 104 而不是 158 吗??
标签: xamarin.android portable-class-library