Я хочу перейти на «ДОСОМЕТИНГ» только в том случае, если он еще не запущен
Ваш вопрос не имеет достаточной информации, поэтому я не могу не сделать предположения о вашейкод.
Мое первое предположение состоит в том, что, основываясь на подписи DataDisplayView_Paint(object s, PaintEventArgs e)
, ваш код выполняется в потоке графического интерфейса.
Мой второйПредполагается, что ваш код DOSOMETHING
является синхронным.
Имея это в виду, вот версия вашего кода, которая гарантирует, что мы будем запускать DOSOMETHING
, только если он еще не запущен:
void DataDisplayView_Paint(object s, PaintEventArgs e)
{
//DOSOMETHING
}
Поток GUI будет обрабатывать только одно сообщение за раз, а ваш метод DataDisplayView_Paint
не завершится, пока не завершится DOSOMETHING
.Если вы делаете что-то с графическим интерфейсом, например, рисуете объект Graphics или меняете метки, то этот код не будет вызываться из более чем одного потока - и если это произойдет, .NET выдаст исключение.Другими словами, вам не нужно никакой синхронизации.
Предположим, что DOSOMETHING
работает асинхронно - теперь у нас есть интересная проблема, но ее очень легко решить,и вам не нужно никаких bools.
По сути, все, что вы делаете, это отключаете ваш обработчик событий во время выполнения DOSOMETHING, а затем снова его включаете.Вместо того, чтобы использовать bool, отцепите и повторно подключите ваш обработчик событий по мере необходимости:
void DataDisplayView_Paint(object s, PaintEventArgs e)
{
DataDisplayView.Paint -= DataDisplayView_Paint;
DoSomethingAsynchronously(); // re-hooks event handler when completed
}
void DoSomethingAsychronously()
{
ThreadPool.QueueUserWorkItem(() =>
{
try
{
// DOSOMETHING
}
finally
{
// may need a lock around this statement
DataDisplayView.Paint += DataDisplayView_Paint;
}
});
}