2016-04-20 6 views
0

У меня вопрос о динамическом вызове и потоках. Предположим, что у меня есть основной поток, который в какой-то момент показывает диалог.Динамическая цепочка вызовов и сна

public void showDialog() 
{ 
    lock(mutexObject) 
    { 
     flagDialogShowing = true; 
     showMssgDialog(properties...); 
     flagDialogShowing = false; 
    } 
} 

Когда я показываю, что Dialog my mainThread получает объект mutexObject и останавливается, пока пользователь не нажмет кнопку «Принять». Так что моя основная нить спала. Если пользователь не нажимает кнопку, и мы ожидаем, что событие будет поднято в другом потоке. Эти события используют dynamicInvoke для вызова предыдущей функции. В этом случае mainThread getUp, и если я не буду использовать flagDialog, будет показано второе диалоговое окно. Это правильно? Что такое dynamicInvoke, если поток не спит? он будет ждать, пока mainThread не будет остановлен? Что произойдет, если я закрою два диалога, как он знает, где продолжить выполнение? Он складывает разные столы и знает, как восстановить старый контекст?

спасибо.

ответ

0

Вместо этого флага, вы можете иметь ваш другой поток сделать

if(Monitor.TryEnter(mutexObject)) 
    raiseEvent(...); 
    Monitor.Exit(mutexObject); 

, если вы хотите, чтобы не ждать вашего текущего диалога, или полный

lock(mutexObject) 
{ 
    raiseEvent(); 
} 

если вы хотите ждать.

Я не слишком долго в C#, поэтому я не буду пытаться отвечать на эти вопросы там, не хочу распространять догадки как знания :)