2010-08-31 2 views
1

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

SqlDependency dependency=new SqlDependency(command); 


// Subscribe to the SqlDependency event. 
dependency.OnChange += new 
OnChangeEventHandler(OnDependencyChange); 

ответ

2

Я не знаком с SqlDependency класса, но согласно MSDN documenation:

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

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

+0

Спасибо, поэтому мне придется подготовиться к некоторому неопределенному поведению :) – nan

0

В обычной однопоточной программе это не так. Попытайтесь следовать:

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

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

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

Смежные вопросы