Есть ли в c # конструкция, которая похожа на lock {}, но работает при вызове из обработчика событий, т.е. ожидает завершения блока кода перед обработкой последующего события.
Проблема, с которой я столкнулся, заключается в том, что lock {} не позволяет другим потокам получить блокировку объекта, но если вызывается обработчик событий в том же потоке, выполнение кода в блоке блокировки прерывается, и новое событие обрабатывается перед возвратом к выполнению исходного кода.
object DoStuffLock = new object();
public void DoStuff()
{
lock (DoStuffLock)
{
// Do stuff that we don't want to be interrupted,
// but because it is called from an event handler
// it still can be interrupted despite the lock
}
}
В настоящее время я работаю над этой проблемой (но это вряд ли идеально):
object DoStuffLock = new object();
// this gets called from an event, and therefore can be interrupted,
// locking does not help, so launch separate thread
public void DoStuff()
{
var x = new Thread(DoStuffInternal);
x.Start();
}
private void DoStuffInternal()
{
lock (DoStuffLock)
{
// Do stuff that we don't want to be interrupted
}
}