SqlDependency (например) запускает событие OnChange, когда вызов предыдущего обработчика событий не завершился? (Предположим, что метод OnDependencyChange занимает очень много времени) Что именно происходит?
SqlDependency dependency=new SqlDependency(command);
// Subscribe to the SqlDependency event.
dependency.OnChange += new
OnChangeEventHandler(OnDependencyChange);
Я не знаком с классом SqlDependency
, но согласно документации MSDN:
Событие OnChange может быть сгенерировано на отдельная ветка от ветки который инициировал выполнение команды.
Похоже, это открывает возможность одновременного запуска двух обработчиков событий. Нет документации, в которой бы говорилось, что все обработчики событий, вызываемые при инициировании события, должны завершиться, прежде чем событие можно будет инициировать снова. Безопаснее всего предположить, что может произойти несколько одновременных вызовов события. Поскольку событие вызывается в неопределенном потоке, вам все равно придется защищаться от проблем параллелизма.
В обычной однопоточной программе этого не будет. Попробуйте следующее:
Добавьте приложение Windows Forms. Добавьте кнопку на форму. Используйте следующий метод для обработки события нажатия кнопки:
private void Buttonclick(object sender, EventArgs e)
{
Thread.Sleep(25);//SUSPEND CURRENT THREAD
}
вы не сможете нажать кнопку, пока вызов Thread.Sleep(25)
не завершит свою работу (приостановить поток на 25 секунд). Вы также можете проверить это в консольном приложении.