2 EventHandlers, вызывающие одну и ту же функцию - PullRequest
0 голосов
/ 12 февраля 2020

Если у меня есть 2 события в моем приложении, скажем, Event1 и Event2, которые независимы и могут вызываться случайным образом другими факторами.

В их EventHandlers я вызываю функцию.

 void OnEvent1(EventArgs e)
{
    A();
}

 void OnEvent2(EventArgs e)
{
   A();
}

void A(){

// logic

}

Если одно из событий поступило в то время, когда A () все еще выполняется из предыдущего события, ждет ли оно выполнения A logi c или оно прерывает A c и может вызвать состояние гонки?

1 Ответ

1 голос
/ 13 февраля 2020

Для немедленного ответа вы можете использовать блокировку: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement

В конечном итоге это «заблокирует» объект и не позволит другому потоку заблокировать / использовать тот же объект пока оригинальный замок не будет снят. Единственное, на что вы хотели бы обратить внимание - это состояние тупика - когда два потока ожидают, что что-то произойдет, прежде чем он завершит выполнение A (). Есть смысл?

 private readonly object taskLock = new object();

 void OnEvent1(EventArgs e)
 {
     lock (taskLock)
     {
        A();
     }
 }

 void OnEvent2(EventArgs e)
 {
     lock (taskLock)
     {
        A();
     }
 }

 void A()
 {
    // logic
 }

Я буду использовать блокировки на таблице данных или объектах списка, когда у меня есть фоновый рабочий / альтернативный поток, выполняющий задачу (вы можете заблокировать другие объекты, вам НЕ НУЖНО делать «taskLock») .

...