我们正在开发一个软件来控制一个科学的测量设备。它提供了一个COM-Interface定义了几个功能来设置测量参数并在测量数据时触发一个事件。C#COM跨线程
为了测试我们的软件,我正在实现该设备的模拟。
com对象运行一个定期触发事件的循环。客户端应用程序中的另一个循环现在应该使用给定的函数来设置com模拟器。
我创建了一个测量参数的类,它将在设置新测量时实例化。
// 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()被调用时,服务器上的对象被设置为一个新的实例。但在下一个函数中,该对象再次为空。在处理服务器事件时做同样的事情,它完美地工作,因为方法在服务器线程中运行。如何使它从客户端线程工作。
由于客户端旨在与真实设备一起工作,因此我无法修改制造商提供的接口。我还需要设置独立于事件处理程序的度量,该度量将不会定期触发。
我认为这个问题与多线程COM行为有关,但是我没有在这个主题上发现任何东西。
感谢。我错过了明确地将服务器环路设置为MTA。 – user364676 2010-06-11 16:40:35
当然你想这样做?你的代码不是线程安全的。 – 2010-06-11 16:44:04