C# 本机调用,应用程序调用为不同线程封送的接口
我正在编写需要在后台调用本机C++/CX类的Windows/Windows Phone 8.1应用程序 目前,我有这样一个代码(在异步方法中( 在调用C# 本机调用,应用程序调用为不同线程封送的接口,c#,multithreading,windows-runtime,C#,Multithreading,Windows Runtime,我正在编写需要在后台调用本机C++/CX类的Windows/Windows Phone 8.1应用程序 目前,我有这样一个代码(在异步方法中( 在调用.process()时,我得到一个异常,它说WinRT信息:应用程序调用了一个为不同线程编组的接口。 问题是,我想知道到底是什么问题——本机类不是也在后台创建的(在Task.Run内部?) 编辑: 我尝试在线程池调用中执行同样的操作,但同样的事情也发生了。是否有一些奇怪的C#到C++/CX互操作的事情我不知道 IAsyncAction asyn
.process()
时,我得到一个异常,它说WinRT信息:应用程序调用了一个为不同线程编组的接口。
问题是,我想知道到底是什么问题——本机类不是也在后台创建的(在Task.Run内部?)
编辑:
我尝试在线程池调用中执行同样的操作,但同样的事情也发生了。是否有一些奇怪的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
}
});
找到了罪魁祸首-在遍历代码时,我发现它在我的C++/CX代码创建
ref new Foo();
的行上崩溃,其中Foo来自Windows::UI::Xaml::DependencyObject
(目前似乎是一个不错的基类,因为唯一可能的公共未密封类型是在Windows::UI::Xaml命名空间下找到的类型,用户无法创建自己的公共未密封类型)
显然,您只能从应用程序的XAML UI线程创建和访问从DependencyObject继承的XAML元素,因此我必须重构代码以避免从该线程继承。这将取决于NativeParser类:它编写灵活吗?它在内部做什么?它调用其他具有线程亲和力的东西吗?只是c加入组件不会改变线程,但组件可能对特定线程具有内部依赖关系。例如,如果NativeParser使用诸如RichEditBox之类的UI对象进行解析,则它将对dispatcher具有依赖关系thread@RobCaplan-MSFT-它创建了从DependencyObject派生的对象,我没有做任何其他的修改一个可以从中继承的类,这就是问题所在
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
}
});