如何在c#中暂停循环(while, foreach, for或其他)

本文关键字:foreach for 其他 while 循环 暂停 | 更新日期: 2023-09-27 18:17:41

是否有一种方法可以在不阻塞的情况下暂停循环指定时间?我不想使用Thread.Sleep(xx)。是否有一种方法可以使用手动事件或调度计时器来暂停循环?我不想使用线程。因为它阻塞了线程,我不想这样。

编辑:

我想做的是类似于这里的post:

serialport响应eventandler,但不是ReadExisting或ReadLine?

那里没有答案,所以我在这里解释了我需要做什么。

我不能打开串行端口并保持它打开,我必须每次关闭它。我要做的是点击循环中的第一个条目,打开这个容器,向它写入,从它读取,然后关闭它。如果你曾经在windows上使用过鼠标或蓝牙扫描仪,你就会知道并不是所有的电脑都能一直发送信息。因此,如果端口没有发送回消息,则必须超时。如果短时间内没有收到消息,我需要继续前进。

如果第一次没有响应,它可能会用不同的消息再次到达相同的端口。当我这样做时,我得到一个错误,端口已经打开;确实是这样,因为循环只是在代码中执行,没有足够的暂停。

线程。Sleep只是阻塞了线程,同时阻塞了通信器发回的消息,我不知道为什么,它就是阻塞了。我宁愿不使用thread.sleep。

当我循环通过

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

是否有一种方法可以启动循环,在新线程上生成一个方法,暂停调用它的循环,等待消息返回或时间限制,然后在另一个线程这样说时继续循环?由于

编辑

我使用了AutoResetEvent。谢谢你的帮助

如何在c#中暂停循环(while, foreach, for或其他)

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

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

如果你暂停某事,那它就被定义阻塞了。暂停一个线程肯定会把控制权交给其他线程。

除非你需要别的东西而不是暂停?

是什么让你暂停-也许如果你更新你的问题…

我刚刚发现-也许你想暂停并让UI运行-然后做这样的事情(在循环的每一步):

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

这将有GUI响应你,并将减慢你的循环。