Событие запускается, когда предыдущий обработчик не закончил? - PullRequest
1 голос
/ 31 августа 2010

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

SqlDependency dependency=new SqlDependency(command);


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

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

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

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

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

0 голосов
/ 31 августа 2010

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

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

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

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

...