Как приостановить код, пока я не хочу? [что-то вроде Thread.Sleep (int);] - PullRequest
1 голос
/ 17 января 2012

Я думаю, что лучший способ выразить свою точку зрения - привести следующие примеры:

Console.ReadLine(); 
Process.WaitForExit();

Эти функции приостановят работу приложения (не останавливая интерфейс).

Мне нужно что-то вроде этого.

На самом деле я пишу что-то вроде ReadLine(), но в windows forms applications.
Когда вы вызываете этот метод, его следует ждать, покапользователь нажимает Введите .

Ответы [ 5 ]

2 голосов
/ 17 января 2012

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

1 голос
/ 17 января 2012

Консольные приложения не имеют пользовательского интерфейса, поэтому функция WaitForExit () не может зависнуть.В консольном приложении chrome (строка заголовка и кнопки окна) обрабатываются системой.В приложении WinForms эти вещи не отображаются, пока вы не передадите события NC_PAINT обработчику по умолчанию.Если ваш основной цикл сообщений спит, значит, ваш chrome не окрашивается.

Приложение WinForms не закрывается автоматически, поэтому не должно быть никаких причин для вызова чего-то вроде WaitForExit ().Вместо этого вы явно указываете приложению, когда закрываться, например, когда пользователь нажимает клавишу escape или что-то в этом роде.

1 голос
/ 17 января 2012

Вы можете использовать backGroundWorker , который просто проверяет отмену и ждет некоторое время, используя, например, Thread.Sleep (100).

Другой способ - создать собственный поток и самостоятельно контролировать все проверки и обратные вызовы.

0 голосов
/ 17 января 2012

Скорее всего, вам вообще не нужно останавливать выполнение в приложении Windows Forms.

Приложения Windows Forms обычно требуют гораздо более согласованной архитектуры. Если вам нужен какой-то код для продолжения после пользовательского ввода, вам не следует останавливать выполнение функции. Напротив, откройте диалоговое окно (или предоставьте пользователю любое другое средство для выполнения требуемого ввода) и просто подождите, пока он «с ним не поработает». Взаимодействие должно вызывать C # event s, которые будут обрабатываться экземпляром логического класса, который знает, как это сделать, и подписан на них.

0 голосов
/ 17 января 2012

Попробуйте это

Task logManager = Task.Factory.StartNew(() => {   /* Your code */ }, TaskCreationOptions.LongRunning);

или даже

Task screenshotManager; 

     private void StartScreenshotManager()
            {
                screenshotManager = Task.Factory.StartNew(() => { ScreenshotManagerJob(); }, TaskCreationOptions.LongRunning);
                screenshotManager.ContinueWith((t) => { ScreenshotManagerUpdateUI(); }, TaskScheduler.FromCurrentSynchronizationContext());
            }

            private void ScreenshotManagerUpdateUI()
            {
                // ... UI update work here ... 
            }

            private void ScreenshotManagerJob()
            {
             // your code
             }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...