我正试图在win 8.1中实现共享目标应用程序合同。 示例共享目标应用程序代码有效,但是当我尝试使用以下代码读取storageItem文件时:
storageItems.getAt(i).openReadAsync().then(function(stream) {
});
我收到错误:
0x8000001f - JavaScript运行时错误:对ASTA的COM调用是 被阻止,因为呼叫链起源于或通过另一个 ASTA。这种呼叫模式容易出现死锁,并且公寓不允许 呼叫控制。
是另一个WinJs / Win8.1预览错误还是我做错了什么?
答案 0 :(得分:8)
我遇到了同样的问题。遗憾的是,在MSFT提出的有关共享合同目标的所有示例和教程以及示例代码中,其中没有一个实际读取共享文件。
我没有声称具体了解幕后发生了什么,但它同时涉及共享目标(您的应用程序)的UI线程和共享源的UI线程同时位于调用堆栈上在OpenReadAsync调用期间,这是造成这种情况的原因。
解决方案是将您的OpenReadAsync调用从您的UI线程移开。很抱歉不知道JS这样做的方法,但是我在C#中修复这个问题的方式是:
// BAD - This produces: "A COM call to an ASTA was blocked because the call
// chain originated in or passed through another ASTA. This call pattern
// is deadlock-prone and disallowed by apartment call control."
//
// IRandomAccessStreamWithContentType stream = await fileReceived.OpenReadAsync();
// GOOD - This moves the OpenReadAsync off of the UI thread and works fine...
//
IRandomAccessStreamWithContentType stream = await Task.Run(async () =>
{
return await fileReceived.OpenReadAsync();
});