You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中基于Vimba Camera API,事件内触发后续事件失败求助

问题出在你只是注册了事件处理程序,却没有触发事件!

让我帮你拆解一下问题所在:

你的代码里的两个核心问题

  • 每次触发第一个事件都重复注册第二个事件的处理程序:在OnFirstEvent里每次都执行SomethingHappened += new SecondEventHandler(HandleSomethingHappened);,这会导致HandleSomethingHappened被绑定多次,后续触发事件时这个方法会被执行N次(N是第一个事件触发的次数),这肯定不是你想要的。
  • 根本没有触发SomethingHappened事件:你只给事件加了处理函数,但从来没有告诉程序“现在要触发这个事件,把数据传出去”,这就像你给按钮加了点击后的逻辑,但从来没点按钮一样。

修正后的代码示例

public partial class Form1 : Form 
{ 
    public delegate void SecondEventHandler(int[] myData); 
    public event SecondEventHandler SomethingHappened; 

    // 初始化的时候注册事件,而不是每次第一个事件触发时注册
    public Form1()
    {
        InitializeComponent();
        // 这里注册第二个事件的处理程序,只做一次
        SomethingHappened += HandleSomethingHappened;
        // 注册第一个事件(你的原有代码)
        myObj.OnFirstEvent += OnFirstEvent;
    }

    private void OnFirstEvent(Data data) 
    { 
        // 处理第一个事件的逻辑,准备myData
        int[] myData = PrepareMyData(data); // 假设这是你准备数据的方法

        // 关键:触发第二个事件!用空条件运算符避免空引用异常
        SomethingHappened?.Invoke(myData);
    } 

    void HandleSomethingHappened(int[] myData) 
    { 
        // 处理myData的逻辑
    } 

    // 示例:准备数据的方法
    private int[] PrepareMyData(Data data)
    {
        // 这里写你转换data为int[]的逻辑
        return new int[0];
    }
}

关键知识点补充

  • 事件的处理程序只需要注册一次,通常在类的初始化阶段(比如构造函数、Form_Load事件)完成,而不是每次触发事件时重复注册。
  • 触发事件的标准写法是用?.Invoke(参数),空条件运算符?.会自动判断事件是否有注册的处理程序,避免出现NullReferenceException(如果没有任何处理程序绑定到事件,直接调用Invoke会报错)。
  • 如果你需要确保线程安全(比如Vimba的事件可能在非UI线程触发,而你的第二个事件处理程序要操作UI),还需要在HandleSomethingHappened里检查控件的InvokeRequired,切换到UI线程再操作:
    void HandleSomethingHappened(int[] myData) 
    { 
        if (someControl.InvokeRequired)
        {
            someControl.Invoke(new SecondEventHandler(HandleSomethingHappened), myData);
            return;
        }
        // 这里写操作UI的逻辑
    }
    

内容的提问来源于stack exchange,提问作者Trion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:36:35