C # Подождите, пока слушатели событий не закончили - PullRequest
2 голосов
/ 22 марта 2011

В программе winforms C # у меня есть событие, которое срабатывает, когда кто-то пытается переименовать проект. В EventArgs для этого события у меня есть свойство «Отмена», которое слушатели события могут установить в true, чтобы (в идеале) отменить переименование (например, если имя уже используется):

ProjectRenamedEventArgs args = new ProjectRenamedEventArgs(oldName, newName);

if (NameChanged != null)
    NameChanged(this, args);

if (args.Cancel)
{
    // Cancel
}
else
{
    // Continue
}

Проблема в том, что строка if (args.Cancel ....) никогда не достигается. Я предполагаю, что выполнение продолжается сразу после события, и, следовательно, args.Cancel всегда ложно, поэтому переименование всегда происходит. Как сделать остановку выполнения до тех пор, пока все слушатели событий не завершат свою работу (давая args.Cancel шанс установить значение true).

Я предполагаю, что это возможно, потому что многие из оконных форм EventArgs имеют свойство Cancel, которое позволяет отменять то, что только что произошло (например, изменение метки на TreeNode TreeView).

Ответы [ 4 ]

2 голосов
/ 22 марта 2011

Вы говорите: «Проблема в том, что строка if (args.Cancel ....» никогда не достигается »

Это говорит мне о том, что ваши обработчики событий, связанные с NameChanged, не возвращаютсяДругая возможность состоит в том, что один из этих обработчиков генерирует необработанное исключение, а приведенный выше код в вашем примере поглощает исключение.

-Oisin

1 голос
/ 22 марта 2011

Как сделать остановку выполнения до тех пор, пока все слушатели событий не закончат свою работуесли вы позвоните NameChanged напрямую.Попробуйте войти в обработчики событий, чтобы увидеть, что происходит

1 голос
/ 22 марта 2011

События являются синхронными по умолчанию = ваш текущий код должен работать.

Вам нужно использовать BeginInvoke, чтобы сделать события асинхронными (вещь, которую вы хотите избежать)

0 голосов
/ 22 марта 2011

Единственная причина не вызывать if (args.Cancel) .., о которой я могу думать, заключается в том, что внутри одного из обработчиков событий есть необработанное исключение.

Обратите внимание, что иногда у меня возникают проблемы с отладчиком vs2008 / vs2010, который продолжает работуосновное приложение вместо остановки за событием-вызовом.Вы можете проверить это, если установите точку останова на if (args.Cancel) ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...