【问题标题】:Native call and The application called an interface that was marshalled for a different thread本机调用和应用程序调用了为不同线程编组的接口
【发布时间】: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


【解决方案1】:

找到了罪魁祸首——在单步执行代码时,我发现它在我的 C++/CX 代码正在创建 ref new Foo(); 的行上崩溃了,其中 Foo 派生自 Windows::UI::Xaml::DependencyObject(在唯一可能的公共未密封类型是在 Windows::UI::Xaml 命名空间下找到的类型,用户无法创建自己的公共未密封类型)。

显然,您只能从应用程序的 XAML UI 线程创建和访问从 DependencyObject 继承的 XAML 元素,因此我必须重构代码以避免从该元素继承。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多