2014-09-14 5 views
1

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

System is processing. please wait

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

Интересно, может ли этот сценарий быть реализован с помощью нового механизма async/await. Я сомневаюсь в этом.

ответ

2

То, что вы называете блокировкой пользовательского интерфейса, не блокирует пользовательский интерфейс. Блокирование потока пользовательских интерфейсов означает остановку обработки сообщений, чтобы пользовательский интерфейс не мог изменять и реагировать на ввод. Окно обычно отображается в Windows, если это обнаружено.

Вы хотите показать модальный диалог. Вы можете сделать это с помощью BackgroundWorker или более современным способом с async и await. Например:

void MyClickHandler(...) { 
var form = new MyForm(); 
Task myAsyncOperation = StartOperationAsync(form); 
form.ShowDialog(); 
await myAsyncOperation; 
} 

async Task StartOperationAsync(Form formToClose) { 
await DoSomething(); 
formToClose.Close(); 
} 

Весь этот код мультиплексируется по потоку пользовательского интерфейса. Защита резьбы не вызывает беспокойства.

+1

работает как очарование. большое спасибо. – Nico