2015-12-08 3 views
2

Я использую .NET 4.0 (без async).Как я могу сделать Monitor.Wait с обработкой очереди сообщений?

Я ищу сочетание Monitor.Wait и Application.Run. Я просматриваю объект-проводник, но не могу его найти.

Он существует? Если нет, каков наилучший способ его реализации?

Я все еще ничего не пытался, потому что то, что я имею в виду, очень грязно. Что-то вроде этого:

while (!(timeOutHasBeenReached || aLockHasBeenAcquired)) 
{ 
    Application.DoEvents() ; 
} 

Чтобы избежать проблемы XY, позвольте мне представить конечную цель (относится к единице тестирования):

using (ApplicationContext applicationContext = new ApplicationContext()) 
{ 
    using (Control control = new Control() { Visible = true }) 
    { 
     // control will do something across the web 
     // When the control has done it, it will raise an event invoking applicationContext.Exit() 
     // As a web connection is not always timing trustfull I'd like 
     // to specify a timeout (or eventually abort it with a Monitor.Pulse) 

     Application.Run(applicationContext);   
    } 
} 

управления является компонентом Winform, который я не могу изменить, и я дон 't хочу сделать Thread.Abort.

+1

Application.DoEvents() обычно (и много раз ошибочно) используется для «избежания» многопоточности. Итак, что вы пытаетесь сделать точно? – yms

+0

@yms: Я сделал редактирование –

+1

Невозможно отменить, выполнив 'control.Invoke (() => Application.Exit());'? Или просто 'control.Close();' или Dispose. – usr

ответ

2

Вы не можете отменить, выполнив control.Invoke(() => Application.Exit());? Или просто control.Close(); или Dispose.

+0

Я сделаю это с этим. Реальная проблема заключалась в том, что я был связан с синхронизацией. –

Смежные вопросы