Вызывается ли событие, когда предыдущий обработчик не завершил?

SqlDependency (например) запускает событие OnChange, когда вызов предыдущего обработчика событий не завершился? (Предположим, что метод OnDependencyChange занимает очень много времени) Что именно происходит?

SqlDependency dependency=new SqlDependency(command);


// Subscribe to the SqlDependency event.
dependency.OnChange += new
OnChangeEventHandler(OnDependencyChange);
1
задан nan 31 August 2010 в 17:52
поделиться

2 ответа

Я не знаком с классом SqlDependency, но согласно документации MSDN:

Событие OnChange может быть сгенерировано на отдельная ветка от ветки который инициировал выполнение команды.

Похоже, это открывает возможность одновременного запуска двух обработчиков событий. Нет документации, в которой бы говорилось, что все обработчики событий, вызываемые при инициировании события, должны завершиться, прежде чем событие можно будет инициировать снова. Безопаснее всего предположить, что может произойти несколько одновременных вызовов события. Поскольку событие вызывается в неопределенном потоке, вам все равно придется защищаться от проблем параллелизма.

2
ответ дан 2 September 2019 в 21:40
поделиться

В обычной однопоточной программе этого не будет. Попробуйте следующее:

Добавьте приложение Windows Forms. Добавьте кнопку на форму. Используйте следующий метод для обработки события нажатия кнопки:

private void Buttonclick(object sender, EventArgs e)
{
    Thread.Sleep(25);//SUSPEND CURRENT THREAD
}

вы не сможете нажать кнопку, пока вызов Thread.Sleep(25) не завершит свою работу (приостановить поток на 25 секунд). Вы также можете проверить это в консольном приложении.

0
ответ дан 2 September 2019 в 21:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: