Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 本机调用,应用程序调用为不同线程封送的接口_C#_Multithreading_Windows Runtime - Fatal编程技术网

C# 本机调用,应用程序调用为不同线程封送的接口

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

我正在编写需要在后台调用本机C++/CX类的Windows/Windows Phone 8.1应用程序

目前,我有这样一个代码(在异步方法中(

在调用
.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
                }
            });