【问题标题】:Can't click button when using Thread.Sleep in C#?在 C# 中使用 Thread.Sleep 时无法单击按钮?
【发布时间】: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 我找到了两种方法来做到这一点。使用TimerBackgroundWorker。但是BackgroundWorker 似乎不适合我的场景。
  • timer1.Start() 不会阻塞线程,它只会告诉计时器在 20 毫秒间隔后触发事件。 timer.Start() 之后的代码将继续执行。因此,虽然不清楚您要完成什么,但我假设timer.Start() 之后的所有代码应该在您找到iframe 时实际执行?然后只需将此代码移动到不同的方法中,并在找到iframe 后从计时器处理程序中调用它。
  • @Groo 是的,所有代码都应该在找到iframe 之后执行。有时找不到iframe 它应该等待用户与应用程序交互;具体来说,用户点击一个按钮。将代码移动到另一种方法真的可以解决这个问题吗?

标签: c# multithreading timer


【解决方案1】:

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

evtButtonClicked = new AsyncManualResetEvent();

await evtButtonClicked.WaitAsync();

// continuation code...

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

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 2021-08-30
    • 2019-05-30
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多