【发布时间】:2014-12-24 15:17:24
【问题描述】:
我正在编写需要在后台调用本机 C++/CX 类的 Windows/Windows Phone 8.1 应用程序。
目前我有这样的代码(在异步方法中(
var list = await Task.Run(()=> {
var parser = new NativeParser();
return parser.process("someData"); //here I get the exception
});
在.process() 的呼叫中,我收到一个异常说WinRT information: The application called an interface that was marshalled for a different thread.
问题是我想知道到底是什么问题 - 本机类不是也在后台创建的(在 Task.Run 内吗?)
编辑: 我试图在 ThreadPool 调用中做同样的事情——同样的事情发生了。是否有一些我不知道的奇怪的 C# 到 C++/CX 互操作的东西?
IAsyncAction asyncAction = ThreadPool.RunAsync((workItem) =>
{
var parser = new NativeParser();
return parser.process("someData");
});
asyncAction.Completed = new AsyncActionCompletedHandler(
(IAsyncAction asyncInfo, AsyncStatus asyncStatus) =>
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// update UI
}
});
【问题讨论】:
-
这将取决于 NativeParser 类:它是否灵活编写?它在内部做什么?它会调用其他具有线程亲和力的东西吗?只是调用组件不会改变线程,但组件可能对特定线程有内部依赖。例如,如果 NativeParser 使用诸如 RichEditBox 之类的 UI 对象进行解析,那么它将依赖于调度程序线程
-
@RobCaplan-MSFT - 它创建了从 DependencyObject 派生的对象,我没有任何其他合理的类可以继承,所以这就是问题
标签: c# multithreading windows-runtime