Как я могу приостановить цикл (в то время как, foreach, для или иным образом) в C #? - PullRequest
0 голосов
/ 11 декабря 2011

Есть ли способ приостановить цикл на указанное время без блокировки?Я не хочу использовать Thread.Sleep (xx).Есть ли способ использовать ручное событие или диспетчерский таймер для приостановки цикла?Я не хочу использовать thread.sleep, потому что он блокирует поток, и я не хочу этого.

РЕДАКТИРОВАТЬ:

То, что я хочу сделать, похоже на сообщение здесь:

serialport, отвечающий на EventHandler, но не ReadExisting или ReadLine?

там нет ответа, поэтому я объяснил, что мне нужно сделать здесь.

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

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

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

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

есть ли способ запустить цикл, запустить метод в новом потоке, приостановить цикл, который его вызвал, дождаться возвращения сообщения или ограничения по времени, а затем продолжить цикл, когда другой потоктак говорит?спасибо

РЕДАКТИРОВАТЬ

Я использовал AutoResetEvent.спасибо за помощь

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

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

Если вам не нужно что-то еще ВМЕСТЕ приостановки?

Что для вас ПАУЗА - возможно, если вы обновите свой вопрос ...

Я только что понял - может быть, вы хотите сделать паузу и запустить пользовательский интерфейс - а затем сделать что-то вроде этого (на каждом шаге вашего цикла):

int times = 100;
while (times > 0) 
{
    Application.DoEvents();
    Thread.Sleep(10);
    times--;
}

В обоих случаях вам будет отвечать GUIи замедлит ваш цикл.

0 голосов
/ 11 декабря 2011

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

В приведенной ссылке внизу показан пример, где показано, как его использовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...