C# 调用包含委托的click事件会停止应用程序启动

C# 调用包含委托的click事件会停止应用程序启动,c#,.net,winforms,events,delegates,C#,.net,Winforms,Events,Delegates,我的用户控件上有一个刷新按钮,每次单击它都可以正常工作。这是单击事件的代码: private void btnRefresh_Click(object sender, EventArgs e) { if (!RefreshFolder()) { Notify(new string[] { "Refresh failed." }); } else { Notify(new string[] { "Refreshed." });

我的
用户控件
上有一个刷新按钮,每次单击它都可以正常工作。这是单击事件的代码:

private void btnRefresh_Click(object sender, EventArgs e)
{
    if (!RefreshFolder())
    {
        Notify(new string[] { "Refresh failed." });
    }
    else
    {
        Notify(new string[] { "Refreshed." });
    }

}
Notify函数恰好是来自主窗体的委托调用。此函数在正常调用时运行良好。我想做的是在加载用户控件时引发上述事件。但是,当我在load事件上调用
btnRefresh.PerformClick()
时,应用程序不会启动,并在短时间后自动退出。但是当我没有使用
Notify
功能时,我放了一个
MessageBox.Show(“blah”)
功能正常工作

这是我使用的委托:

public delegate void NotifyMe(string[] messages);
在我的主窗体的构造函数中有以下行,以便我的用户控件可以使用主控件的Notify函数:

userctrlSelectManualCampaignFile.Notify += new NotifyMe(Notify);
除非我尝试引发click事件,否则该函数的工作原理与我所说的完全一样。有什么想法吗

更新: 主窗体构造函数:

public MainForm()
{
    InitializeComponent();
    logger = new Logger();
    connectionHelper = new ConnectionHelper();
    datetimeHelper = new DateTimeHelper();
    userctrlSettingsGeneral.Notify += new NotifyMe(Notify);
    userctrlSelectManualCampaignFile.Notify += new NotifyMe(Notify);
}
public ManualCampaignFiles()
{
   InitializeComponent();
}
我的用户控件构造函数:

public MainForm()
{
    InitializeComponent();
    logger = new Logger();
    connectionHelper = new ConnectionHelper();
    datetimeHelper = new DateTimeHelper();
    userctrlSettingsGeneral.Notify += new NotifyMe(Notify);
    userctrlSelectManualCampaignFile.Notify += new NotifyMe(Notify);
}
public ManualCampaignFiles()
{
   InitializeComponent();
}
您可能导致抛出“静默”异常,从而导致应用程序退出

这种异常可能被框架“吞没”,例如在事件处理程序中

尝试将调试环境设置为在引发异常时中断。为此,请转到调试>异常。。。菜单,然后在显示的对话框中,确保选中与公共语言运行时异常对应的“抛出”复选框

这样,当您启动程序时,它将在抛出异常的那一刻中断,从而使您能够了解发生了什么

干杯

我找到了答案:

在引发事件之前,您应该检查事件是否不为null。这是 事件引发的常见模式

答案由Vitaliy Liptchinsky提供


但汉斯·帕桑的回答也非常接近事实。

是的。显示form@T.S.使用主窗体和用户控件构造函数更新。如果您只需调用
btnRefresh\u单击
,而不是
btnRefresh.PerformClick()
,该怎么办?而且,这有点令人困惑。您有
userctrlSettingsGeneral.Notify+=new NotifyMe(Notify)。基本上,您希望实现回调效果。您应该有
private notifyMe\u回调在您的控制中。然后执行'if(_callback!=null)_callback();在64位版本的Windows 7上运行此功能?它有一个bug,当您调试一个强制以32位模式运行的程序时,会导致异常被吞没。调试+异常,勾选CLR异常的抛出复选框以诊断问题。