Метод запускается дважды из обработчика события управления? - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть несколько флажков в группе, и ниже приведен обработчик событий и связанный метод.

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 показывает, что эти вызовы также вызываются дважды.


Оказывается, в Task.Run(...) был вызван метод Filter, и отладчик не смог получить вызывающего. Принятый ответ помог выяснить это.

1 Ответ

0 голосов
/ 15 ноября 2018

Вы уверены, что метод Filter вызывается только из CheckedChanged?Попробуйте что-то вроде этого

    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}");
    // ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...