C#COM Cross Thread

我们正在开发一种控制科学测量设备的软件。 它提供了一个COM接口定义了几个函数来设置测量参数,并在测量数据时触发事件。

为了测试我们的软件,我正在实现该设备的模拟。

com-object运行一个循环,定期触发事件。 客户端应用程序中的另一个循环现在应该使用给定的函数设置com-simulator。

我创建了一个用于测量参数的类,在设置新测量时将对其进行实例化。

// COM-Object public class MeasurementParams { public double Param1; public double Param2; } public class COM_Sim : ICOMDevice { public MeasurementParams newMeasurement; IClient client; public int NewMeasurement() { newMeasurment = new MeasurementParam(); } public int SetParam1(double val) { // why is newMeasurement null when method is called from client loop newMeasurement.Param1 = val; } void loop() { while(true) { // fire event client.HandleEvent; } } } public class Client : IClient { ICOMDevice server; public int HandleEvent() { // handle this event server.NewMeasurement(); server.SetParam1(0.0); } void loop() { while(true) { // do some stuff... server.NewMeasurement(); server.SetParam1(0.0); } } } 

两个循环都在独立的线程中运行。 调用server.NewMeasurement()时,服务器上的对象将设置为新实例。 但在下一个函数中,该对象再次为null。 在处理服务器事件时也这样做,它完美地工作,因为该方法在服务器线程中运行。 如何使它从客户端线程工作。

由于客户端要使用真实设备,我无法修改制造商提供的接口。 我还需要独立于事件处理程序设置测量,不会定期触发。

我假设此问题与multithreadingCOM行为有关,但我在此主题上找不到任何内容。

什么是客户端和服务器的线程模型 – STA或MTA? (供参考 – STA是单线程Com对象,旨在允许一次仅从一个线程访问其公共方法,MTA是允许从多个线程对其公共方法进行concurent访问的multithreading对象)

你有多少个实例,你如何创建这些实例? 我怀疑你只想要一个,但你最终会选择多个。

你有多少个线程,哪个方法在哪个线程上运行? 如何创建这些线程并初始化它们以运行STA对象或MTA?

注意: .NET足够智能,可以检测客户端和服务器是否都受到管理,并将COM从图片中删除。 因此,您的模拟运行纯托管代码。 如果你想要正确的测试客户端,你需要把它写成C ++(因为我怀疑你的设备控制器是非托管代码)。

有关COM线程模型的参考文档:

理解和使用COM线程模型
流程,主题和公寓
COM Interop简介

在您发布的代码中,从未分配COM_Sim.client 。 有什么遗失的吗? 没有看到如何分配对象就很难诊断出来。

另外:您当前在newMeasurement声明为公共字段,但在方法中声明为newMeasurment (拼写不同)。 如上所述,此代码将无法编译。 您的实际方法中可能存在类似的拼写错误,导致您分配的对象与您在NewMeasurement创建的对象不同。