我正在编写需要在后台调用本机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
}
});
答案 0 :(得分:2)
找到罪魁祸首 - 在逐步执行代码时,我发现它在我的C ++ / CX代码创建ref new Foo();
的行上崩溃了,其中Foo来自Windows::UI::Xaml::DependencyObject
(看起来很不错目前的基类,因为唯一可能的公共未密封类型是在Windows :: UI :: Xaml命名空间下找到的类型,用户无法创建自己的公开未密封类型。)
显然,您只能从应用程序的XAML UI线程创建和访问从DependencyObject继承的XAML元素,因此我必须重构代码以避免继承该代码。