首先,我想检查我的对象是否为空。它将在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()
行之后的所有代码。
答案 0 :(得分:1)
假设您的“等待按钮按下”代码在GUI线程中,这看起来很适合await
。考虑创建一个等待事件(manual或auto)并使用该事件代替buttonWasClicked
。您的主要代码将如下所示:
evtButtonClicked = new AsyncManualResetEvent();
await evtButtonClicked.WaitAsync();
// continuation code...
现在,当你调用evtButtonClicked.Set()时,延续代码将排队等候在GUI线程上执行。回想一下await
之后的代码被有效地包装到Task.ContinueWith()
中,这意味着你的GUI线程在等待事件时不会阻塞。