Остановите метод и дождитесь ввода пользователя - PullRequest
3 голосов
/ 16 ноября 2010

Моя программа написана на C # и имеет графический интерфейс в WPF. При нажатии одной кнопки вызывается метод StopAndGo().

Проблема в том, что я хочу, чтобы этот метод остановился в определенных точках, дождался ввода пользователя и затем продолжил.

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

Можете ли вы дать мне несколько советов о том, что нужно сделать?

Спасибо.

Ответы [ 5 ]

3 голосов
/ 17 ноября 2010

Очень простой способ сделать это - использовать вложенные насосы сообщений через DispatcherFrame http://www.deanchalk.me.uk/post/WPF-Modal-Controls-Via-DispatcherFrame-%28Nested-Message-Pumps%29.aspx

Обновленная ссылка: http://deanchalk.com/wpf-modal-controls-via-dispatcherframe-nested-message-pumps/

3 голосов
/ 16 ноября 2010

Ну, во-первых, я не думаю, что многопоточность - это то, что нужно. Если вы хотите, чтобы метод остановился в определенных точках, вы должны закодировать его так, чтобы отображались всплывающие окна, текстовые поля или любая другая область для получения ввода. Поэтому вам потребуется несколько методов для обработки этого, и внутри основного метода вы можете вызывать другие методы для создания этих точек ожидания.

0 голосов
/ 12 июня 2015

Если ваш код не может продолжаться без ввода пользователя, модальные диалоги - это хороший способ избежать нескольких потоков.

DialogBox dialogBox = new DialogBox();

// Show window modally 
// NOTE: Returns only when window is closed
Nullable<bool> dialogResult = dialogBox.ShowDialog();

С https://msdn.microsoft.com/en-us/library/system.windows.window.showdialog(v=vs.110).aspx

0 голосов
/ 16 ноября 2010

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

Для сценариев ожидания вам, вероятно, нужно использовать объекты синхронизации, например ManualResetEvent.

0 голосов
/ 16 ноября 2010

Использовать класс ManualResetEvent.Запустить поток, который выполняет StopAndGo ();Внутри контекста этого потока вызовите

 this.manualResetEvent.WaitOne(TimeSpan.Infinite,false);

, когда ваш пользователь завершит ввод, вызовите

this.manualResetEvent.Set();

, что позволит другому потоку узнать о продолжении stopANdgo

...