C# 调用同一函数的两个EventHandler

C# 调用同一函数的两个EventHandler,c#,eventhandler,C#,Eventhandler,如果我的应用程序上有两个事件,比如Event1和Event2,它们是独立的,可以由其他因素随机调用 在它们的EventHandler中,我调用了一个函数 void OnEvent1(EventArgs e) { A(); } void OnEvent2(EventArgs e) { A(); } void A(){ // logic } 如果其中一个事件到达时A仍在执行前一个事件,它是等待执行逻辑还是中断逻辑并可能导致竞争条件?要立即回答,可以使用lock: 最终,

如果我的应用程序上有两个事件,比如Event1和Event2,它们是独立的,可以由其他因素随机调用

在它们的EventHandler中,我调用了一个函数

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

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

void A(){

// logic

}

如果其中一个事件到达时A仍在执行前一个事件,它是等待执行逻辑还是中断逻辑并可能导致竞争条件?

要立即回答,可以使用lock:

最终,这将“锁定”一个对象,并且在原始锁定被释放之前,不允许另一个线程锁定/使用同一个对象。您唯一需要注意的是死锁情况,即两个线程在完成运行“a”之前等待发生某些事情。有道理吗

 private readonly object taskLock = new object();

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

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

 void A()
 {
    // logic
 }

我将在数据表或列表对象上使用锁当后台工作线程/备用线程运行任务时,您可以锁定其他对象,而不必进行任务锁定

如果回调是从不同的线程调用的,那么您可以有一个竞争条件Events's not magic,它们由同一线程上的调用方调用。事件与线程安全无关。如果从不同的线程调用它们,则必须进行一些同步。因此,要知道事件从何处调用。即使事件是在同一个线程上引发的,例如在UI应用程序中,可重入性也是常见的错误源,但不涉及竞争条件。@对函数a的锁定会阻止这种竞争条件吗?在某种意义上,后一个回调等待前一个回调从执行中完成?@Muhannad没有竞争条件,因为只有一个线程。很抱歉,我有一个愚蠢的问题,但是锁在同一个锁定线程上工作吗?我的意思是,如果一个线程X锁定了代码,并且X试图运行相同的代码,它会通过还是等待锁被释放然后执行?这不是一个愚蠢的问题!是的,如果线程X正在使用代码并试图重新锁定它,它将一直运行,直到第一个请求完成: