在C#中使用Thread.Sleep时无法点击按钮?

时间:2016-08-03 10:21:58

标签: c# multithreading timer

首先,我想检查我的对象是否为空。它将在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()行之后的所有代码。

1 个答案:

答案 0 :(得分:1)

假设您的“等待按钮按下”代码在GUI线程中,这看起来很适合await。考虑创建一个等待事件(manualauto)并使用该事件代替buttonWasClicked。您的主要代码将如下所示:

evtButtonClicked = new AsyncManualResetEvent();

await evtButtonClicked.WaitAsync();

// continuation code...

现在,当你调用evtButtonClicked.Set()时,延续代码将排队等候在GUI线程上执行。回想一下await之后的代码被有效地包装到Task.ContinueWith()中,这意味着你的GUI线程在等待事件时不会阻塞。