繁体   English   中英

如何在C#中暂停循环(同时,foreach,for或其他方式)?

[英]How can I pause a loop (while, foreach, for, or otherwise) in C#?

有没有一种方法可以将循环暂停指定的时间而不会阻塞? 我不想使用Thread.Sleep(xx)。 有没有办法使用手动事件或调度程序计时器来暂停循环? 我不想使用thread.sleep,因为它阻塞了线程,我也不想这样。

编辑:

我想做的类似于在这里发布:

串行端口响应EventHandler,但不响应ReadExisting或ReadLine?

那里没有答案,所以我在这里解释了我需要做的事情。

我无法打开串口并保持打开状态,每次都必须关闭它。 因此,我要执行的操作是单击循环中的第一项,打开该comport,对其进行写入,然后从中读取,然后将其关闭。 如果您曾经在Windows上使用过鼠标或蓝牙扫描仪,那么您就会知道并非每个命令都会一直发送信息。 因此,如果端口不回传消息,则必须超时。 如果短时间内没有收到消息,我需要继续。

如果第一次没有响应,我可能会用不同的消息再次击中同一端口。 当我这样做时,我得到一个错误,表明该端口已经打开; 这是因为循环只是遍历代码而没有足够的停顿。

thread.sleep只是阻止线程,以及该命令发送回该线程的消息,我不知道为什么,它只是这样做。 我宁愿不使用thread.sleep。

当我循环通过它时,我希望它暂停直到关闭端口,然后再从循环中的下一个项目开始。 那是最重要的部分。

有没有办法开始循环,在新线程上产生方法,暂停调用它的循环,等待消息返回或时间限制,然后在另一个线程这样说时让循环继续? 谢谢

编辑

我用了一个AutoResetEvent。 谢谢你的帮助

如果您暂停某些内容,则其将被定义阻止。 暂停一个线程肯定会控制其他线程。

除非您需要其他代替暂停的内容?

对您造成了什么困扰-也许如果您更新问题...

我刚刚弄清楚-也许您想暂停并让UI运行-然后执行以下操作(在循环的每个步骤中):

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

这都会使GUI响应您,并会降低循环速度。

使用ManualResetEvent 它允许您暂停一个线程,直到另一个线程发出信号以继续执行。

在提供的链接中,底部有一个示例,显示了如何使用它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM