从另一个类停止类中的循环
本文关键字:循环 另一个 | 更新日期: 2023-09-27 18:06:14
我有两个事件处理程序button1_Click()和button2_Click()
在button1_Click()中,我有一些东西像这样运行:
toGet = textbox1.Text;
got = 0;
while (got <= toGet)
{
//DoStuff
}
但是button2_Click应该是一个停止按钮,而stopbutton1则早。我该怎么做呢?谢谢你的帮助。我在这里看到了一篇关于它的文章,但是无法让它工作。
Windows。形式回答
最简单的方法是:
private bool m_stop;
private void button1_Click (object s, EventArgs ea)
{
try
{
// Don't forget to disable all controls except the ones you want a user to be able to click while your method executes.
toGet = textbox1.Text;
got = 0;
while (got <= toGet)
{
Application.DoEvents ();
// DoEvents lets other events fire. When they are done, resume.
if (m_stop)
break;
//DoStuff
}
finally
{
// Enable the controls you disabled before.
}
}
private void button2_Click (object s, EventArgs ea)
{
m_stop = true;
}
它有一个明显的优点,让你在UI线程上执行button1_Click,仍然让UI响应你的停止按钮。
它有一个缺点,你必须防止可重入。如果他们点击你的button1,而button1_click已经在执行,会发生什么?
Edit:我使用的另一种方法是使用计时器而不是循环。然后,stop方法只是停止计时器。
据我所知,如果我错了,请纠正我,你在单线程上。很好,但是你可以在你的While循环中检查单个布尔值,就像post建议的那样。
可能是为了让生活更容易(可能这就是"不能让它工作"的意思)是在循环内调用
1) Windows窗体:Application.DoEvents()
2) WPF(有点棘手):WPF中的DoEvents
这使呼吸系统。
您需要在新线程中启动button1
内部的进程,当您按下button2
标志时,本地变量为false以停止循环。如:
using System.Threading;
private volatile bool _requestStop = false;
private readonly object _oneExecuteLocker = new object();
private void OnButton1Click(ojbect sender, EventArgs e)
{
new Thread(() =>
{
if (Monitor.TryEnter(_oneExecuteLocker))
{//if we are here that is means the code is not already running..
try
{
while (!_requestStop)
{
//DoStuff
}
}
finally
{
Monitor.Exit(_oneExecuteLocker);
}
}
}){ IsBackground = true }.Start();
}
private void OnButton2Click(object sender, EventArgs e)
{
_requestStop = true;
}
指出:
- 当你想在新创建的线程中更新UI控件时,你应该使用
contorl.Invoke(/*the code get/set or call method in the UI*/)
。 -
Monitro.Enter
只是为了确保你的代码不会执行多次每次点击,如果它已经运行。