如何在C#中暂停循环(while,foreach,for或other)?

时间:2011-12-10 21:38:30

标签: c# loops

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

编辑:

我想做的就像发布在这里:

serialport responding to EventHandler, but not ReadExisting or ReadLine?

在那里没有回答,所以我已经解释了我需要做什么。

我无法打开串口并保持打开状态,每次都要关闭它。所以,我想要做的是在循环中点击第一项,打开comport,写入它,从中读取,然后关闭它。如果您曾经使用带有Windows的鼠标或蓝牙扫描仪,您知道不是每个comport都会一直发回消息。所以如果一个端口没有发回消息,它必须超时。如果在短时间内没有收到消息,我需要继续。

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

thread.sleep只是阻塞线程,以及comport发送给它的消息,我不知道为什么,它就是这样。我宁愿不使用thread.sleep。

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

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

编辑

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

2 个答案:

答案 0 :(得分:1)

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

除非你需要其他东西INSTEAD暂停?

什么是对你有用 - 也许你更新了你的问题......

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

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

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

答案 1 :(得分:0)

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

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