Thread.Join
- это блокирующий вызов - он остановит поток, который вы вызываете, от любой другой работы. Я предполагаю, что вы ожидаете события в фоновом потоке, но код, который будет вызывать ваше событие, работает в том же потоке, что и код, который вы опубликовали.
Вызывая thread.Join
, вы блокируете поток, который должен выполнять вашу обработку. Итак, вы ждете, пока истечет ваше время ожидания ... затем, каким бы способом ни был опубликован ваш код, завершается ... , затем ваша обработка действительно происходит, и событие ResponseArrived
вызывается.
Было бы полезно, если бы вы опубликовали оставшуюся часть кода, но суть решения будет состоять в том, чтобы запустить фактическую работу (независимо от того, какой код вызывает событие ResponseArrived
) в фоновом потоке - и удалить лишние. пронизываю код, который вы разместили.
РЕДАКТИРОВАТЬ в ответ на комментарий ...
Чтобы синхронизировать две части кода, вы можете использовать AutoResetEvent
. Вместо использования Thread.Sleep
и другого кода, попробуйте что-то вроде этого:
// create an un-signalled AutoResetEvent
AutoResetEvent _waitForResponse = new AutoResetEvent(false);
void YourNewWorkerMethod()
{
_delayedResponse = null;
var result = DoStuff();
// this causes the current thread to wait for the AutoResetEvent to be signalled
// ... the parameter is a timeout value in milliseconds
if (!_waitForResponse.WaitOne(5000))
throw new TimeOutException();
return _delayedResponse;
}
private void OnResponseArrived(object sender, ResponseEventArgs args)
{
_delayedResponse = args.VerificationResponse;
_waitForResponse.Set(); // this signals the waiting thread to continue...
}
Обратите внимание, что вам нужно избавиться от AutoResetEvent
, когда вы закончите с ним.