在多个项目中使用委托和表单时的循环引用

时间:2015-09-29 18:56:34

标签: c# delegates

我的解决方案包括以下项目:

  • MainApp:打开其余表单的主窗体
  • DeviceAcquisition1:控制device1的获取,并在读取数据时引发事件。
  • DeviceAcquisition2:控制设备2的获取并在读取数据时引发事件
  • 信号监控:绘制从device1或device2收到的数据(只有一个已连接并收集数据)
  • 数据分析:绘制收集的数据

我想从SignalMonitoring下标事件,但我有循环引用的问题。这就是我想要做的事情:

MainForm.cs

private void btnCollectData_Click(object sender, EventArgs e)
{
    Device1BoardForm = new gUSBampBoard();
    Device1BoardForm.ShowDialog(); 
}

DeviceAcquisition1和DeviceAcquisition2

 private void btnSignalMonitoring_Click(object sender, EventArgs e)
    {

       //Show new form
       var signalMonitoringForm = new SignalMonitor();
        signalMonitoringForm.Parent = this;

       // Subscribe to event
        DeviceAcq1.DataRead += signalMonitoringForm.OnDataRead;//CANNOT DO THAT!

        signalMonitoringForm.ShowDialog();
    }

SignalMonitoring

        public void OnDataRead(object source, RawdataEventArgs e)
    {
        if (e.rawData.Length > 0)
        {
            AddData(e.rawData);
        }
    }

但是我无法订阅,因为DeviceAcqusition1将SignalMonitoring作为参考,我无法在SignalMonitoring中添加DeviceAcquisition1,因为那时我有循环引用。我需要加载表单并订阅委托。我该怎么办?

1 个答案:

答案 0 :(得分:1)

由于SignalMonitoringMainApp都是应用,因此都不应从DeviceAcquisition项目中引用它们。尝试解决问题,以便应用程序依赖于DeviceAcquisition项目,但不是相反。

对于您的具体情况,只需将RawdataEventArgs移至SignalMonitoring,您就应该好好去。

在DeviceAcqusition项目可以实现的SignalMonitoring内添加一个接口。这样,DeviceAcqusition项目可以依赖于SignalMonitoring,而不是相反。