AutoResetEvents在等待事件处理程序时锁定主线程

时间:2015-10-07 16:18:35

标签: c# wait autoresetevent

简要说明是我试图用我无法控制的第三方DLL启动几个连接事件。一旦发生连接,就会触发一个事件。

我需要在主线程上等待,直到发生这种情况,但每次我设置它都会锁定主线程。

private EventWaitHandle _waitForChannel = new AutoResetEvent(false);

致电代码

new Thread(StartInstrumentMonitoring).Start();

= ------------------

public void StartInstrumentMonitoring(){
if(this.instrumentList.Count == 0){
    new Thread(startConnections).Start()
_waitForChannel.WaitOne();

= -----------------------------

public void startCOnnections(){
 CODE HERE TO DETERMINE INSTRUMENT
 instrument.connectionReceived += instrument_connectionEvent;

instrument_connectionEvent(object sender, ResultEventArgs e){

            if (sender.Name == instrument.Identifier || sender.Identifier == instrument.Identifier)
                _waitForChannel.Set();
}

此代码的问题在于,在执行StartInstrumentMonitoring后,它会向第三方DLL发出必要的调用并附加事件处理程序以与所述库进行交互。显然调用WaitOne()来阻止我主要的线程阻止我捕获instrument_ConnectionEvent

返回的事件

1 个答案:

答案 0 :(得分:0)

如果根本没有调用instrument_ConnectionEvent,那么第三方库当然可能会尝试在主线程上触发事件,这会导致当前代码出现死锁。

您可以使用简单的条件检查来查看您的连接是否已建立,而不是AutoResetEvent。您可以在循环中调用Application.DoEvents()以强制处理消息队列。

while(<check condition> == false)
{
    Application.DoEvents();
}