本机调用和 应用程序调用了为不同线程封送的接口
本文关键字:调用 线程 接口 应用程序 本机 | 更新日期: 2023-09-27 18:35:14
我正在编写Windows/Windows Phone 8.1应用程序,该应用程序需要在后台调用本机C++/CX类。
目前我有这样的代码(在异步方法(
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
}
});
找到了罪魁祸首 - 在逐步执行代码时,我发现它在我的 C++/CX 代码创建ref new Foo();
的行上崩溃了,其中 Foo 派生自 Windows::UI::Xaml::DependencyObject
(目前似乎是一个很好的基类,因为唯一可能的公共未密封类型是在 Windows::UI::Xaml 命名空间,并且用户无法创建自己的公共未密封类型)。
显然,您只能从应用的 XAML UI 线程创建和访问从 DependencyObject 继承的 XAML 元素,因此我必须重构代码以避免从该元素继承。