2012-04-04 7 views
1

У меня есть UserControl, при котором сообщение появляется постепенно, и через несколько секунд оно снова исчезнет. Этот элемент управления использует backgroundWorker. Все в порядке. Но я должен добавить перегрузки для метода, который отвечает за выдавалось сообщение как:Лучший способ дождаться контроля пользовательского интерфейса?

ShowMessage(string message, bool waitToHide) { .. } 

Теперь, мне нужно знать, что лучший способ сделать вызывающий поток (интерфейс резьбы) ждать выше метод ,


Я попытался поднять событие, чтобы уведомить вызывающую сферу, что внутри BackgroundWorker завершен, но так как этот метод часто используется в главном приложении, я должен разбить много унифицированных областей в некоторых рассеянных них.

{ 
    // before code snippet.. 
    messageDisplayer1.ShowMessage("test", true); 
    // after code snippet.. 
} 

превратится:

{ 
    // before.. 
    messageDisplayer1.ShowMessage("test", true); 
} 

void messageDisplayer1_Done() 
{ 
    // after.. 
} 

ответ

3

Если вы должны придерживаться .NET 3.5 или .NET 4 без асинхронного CTP, я не думаю, что вы будете в состоянии избежать разделений коды (если вы не захотите засорить свой код DoEvents, что определенно не рекомендуется).

С другой стороны, async extensions (либо CTP для .NET 4 или версии, включенной в .NET 4.5) позволяют сделать что-то вроде этого:

{ 
    // before code snippet.. 
    await messageDisplayer1.ShowMessage("test", true); 
    // after code snippet.. 
} 

Затем компилятор автоматически путы ваш «после фрагмента кода» в отдельный кодовый блок (продолжение), который запускается, как только ShowMessage сигнализирует о завершении. Тем временем управление возвращается в цикл сообщений Windows, оставляя пользовательский интерфейс вашей программы отзывчивым.

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