尝试在win 8.1中读取storageItem文件时共享目标错误

时间:2013-07-22 11:03:29

标签: com winjs windows-8.1

我正试图在win 8.1中实现共享目标应用程序合同。 示例共享目标应用程序代码有效,但是当我尝试使用以下代码读取storageItem文件时:

storageItems.getAt(i).openReadAsync().then(function(stream) {

});

我收到错误:

  

0x8000001f - JavaScript运行时错误:对ASTA的COM调用是   被阻止,因为呼叫链起源于或通过另一个   ASTA。这种呼叫模式容易出现死锁,并且公寓不允许   呼叫控制。

是另一个WinJs / Win8.1预览错误还是我做错了什么?

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(); 
});