本机调用和应用程序调用了为不同线程编组的接口

时间:2014-12-24 06:47:26

标签: c# multithreading windows-runtime

我正在编写需要在后台调用本机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
                }
            });

1 个答案:

答案 0 :(得分:2)

找到罪魁祸首 - 在逐步执行代码时,我发现它在我的C ++ / CX代码创建ref new Foo();的行上崩溃了,其中Foo来自Windows::UI::Xaml::DependencyObject(看起来很不错目前的基类,因为唯一可能的公共未密封类型是在Windows :: UI :: Xaml命名空间下找到的类型,用户无法创建自己的公开未密封类型。)

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