代码之家  ›  专栏  ›  技术社区  ›  Aleksandar Toplek

WinRT C++/CX到C#多线程封送处理

  •  1
  • Aleksandar Toplek  · 技术社区  · 11 年前

    所以我们正在为Windows应用商店开发新的应用程序,我们在应用程序的C++/CX部分使用DirectX,在其他部分使用C#。由于我们需要某种通信,我们在共享库(C#)中创建了接口,并在项目的C#端实现了该接口。然后,我们将该类的实例传递给C++。当C++需要与C#通信时,它从共享接口调用方法,而C#执行类中实现的内容。

    当C++从另一个线程调用方法而不是将对象传递给它时,就会出现问题。错误:

    The application called an interface that was marshalled for a different thread.

    以下是它的工作原理:

    C#                  instance of shared interface (some class)
    
    C# -> C++           \/ passed in parameter of public C++ method
    
    C++                 saves to variable
    C++                 creates new thread
    C++                 calls instance->SayHello();          
    
    C#                  exception
    

    共享接口:(C#)

    public interface IUserMessageService
    {
        void WriteMessage(string message, MessageTypes type);
    }
    

    实现:(C#)

    public sealed class UserMessageService : IUserMessageService
    { ... }
    

    赋值方法(C++)

    void AssignUserMessageService(...::IUserMessageService ^service) { m_service = service; }
    

    然后我打电话 AssignUserMessageService 具有的实例 UserMessageService 来自UI线程。调用时尝试访问C++传递的数据时出错 WriteMessage 在另一个线程中。

    有没有其他方法可以传递实例或调用方法?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Aleksandar Toplek    11 年前

    问题是我在使用 CoreApplication.MainWindow.CoreWindow.Dispatcher 而不是 Window.Current.Dispatcher