1

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

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

});

我收到一个错误:

0x8000001f - JavaScript 运行时错误:对 ASTA 的 COM 调用被阻止,因为调用链源自或通过另一个 ASTA。这种呼叫模式容易发生死锁,并且被公寓呼叫控制所禁止。

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

4

1 回答 1

9

我遇到了同样的问题。不幸的是,在 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(); 
});
于 2013-09-05T19:01:53.077 回答