该方法从控件事件处理程序中触发了两次?

时间:2018-11-15 17:38:23

标签: c# winforms

我在一个组中有一些复选框,以下是事件处理程序和相关的方法。

public async void CheckedChanged(object sender, EventArgs e)
{
    System.Diagnostics.Debug.WriteLine($"Calling CheckedChanged {s.Name}: {s.CheckState}");
    await Filter();
}

public async Task Filter()
{
    System.Diagnostics.Debug.WriteLine($"Calling Filter");
    // ....
}

但是,以下调试输出显示,每次复选框状态更改时,方法Filter被调用两次。

Calling CheckedChanged CheckBox1: Checked
Calling Filter 
Calling Filter
Calling CheckedChanged CheckBox1: Unchecked
Calling Filter
Calling Filter 

方法Filter有一些非常昂贵的数据库调用,SQL Profiler显示这些调用也被调用了两次。


事实证明,在Filter中调用了方法Task.Run(...),调试器无法获取调用者。接受的答案有助于找出答案。

1 个答案:

答案 0 :(得分:1)

您确定只从CheckedChanged调用Filter方法吗? 试试这样的东西

    public async void CheckedChanged(object sender, EventArgs e)
{
    System.Diagnostics.Debug.WriteLine($"Calling CheckedChanged {s.Name}: {s.CheckState}");
    await Filter(nameof("CheckedChanged"));
}

public async Task Filter(string caller = "undefined")
{
    System.Diagnostics.Debug.WriteLine($"Calling Filter from {caller}");
    // ....
}