【发布时间】:2016-08-03 10:21:58
【问题描述】:
首先,我想检查我的对象是否为空。它会在 while 循环中休眠 20 毫秒,让用户可以与 UI 进行交互。
如果while中的条件正确,我可以点击UI中的按钮来打破这个循环并继续其他代码。
我用原始代码试过了:
while (browser.FindElementById("iframe") == null)
{
if(buttonWasClicked == true)
return;
Thread.Sleep(20);
}
我试过了:
Task.Delay(10000).ContinueWith(x =>
{
while (browser.FindElementById("iframe") == null)
{
if(buttonWasClicked == true)
return;
}
});
似乎块代码在后台工作。因此,它会跳过块代码并执行所有下一行代码。
我希望它必须在执行下一个代码之前进行检查。
所以,我尝试了另一种方法。我使用Timer,但我通常不会在应用程序中使用Timer,我对此没有任何经验。
我创建了新的Timer,例如timer1,并设置了interval = 20。
在timer1_Tick事件,我添加代码:
private void timer1_Tick(object sender, EventArgs e)
{
if (browser.FindElementById("iframe") == null)
{
if(buttonWasClicked == true)
break;
}
else
timer1.Stop();
}
在原始代码中,我替换为:
timer1.Start();
在button_Clicked 事件中,我设置为:
timer1.Stop();.
我的代码有任何问题吗?
在调试中,它会跳过事件timer1_Tick() 并执行timer.Start() 行之后的所有代码。
【问题讨论】:
-
.NET 中只有一个 UI 线程来处理所有的 UI 处理。如果您通过睡眠冻结它,您将无法处理事件,并且 UI 将显示无响应。接下来,您添加的 WinForms
Timer也会触发 UI 线程上的事件,并且您不应再次在处理程序中休眠。 -
@Groo 我找到了两种方法来做到这一点。使用
Timer或BackgroundWorker。但是BackgroundWorker似乎不适合我的场景。 -
timer1.Start()不会阻塞线程,它只会告诉计时器在 20 毫秒间隔后触发事件。timer.Start()之后的代码将继续执行。因此,虽然不清楚您要完成什么,但我假设timer.Start()之后的所有代码应该在您找到iframe时实际执行?然后只需将此代码移动到不同的方法中,并在找到iframe后从计时器处理程序中调用它。 -
@Groo 是的,所有代码都应该在找到
iframe之后执行。有时找不到iframe它应该等待用户与应用程序交互;具体来说,用户点击一个按钮。将代码移动到另一种方法真的可以解决这个问题吗?
标签: c# multithreading timer