在计时器中等待 20 秒,然后在没有 Thread.Sleep.C# 的情况下执行下一行

本文关键字:执行 情况下 一行 Thread 等待 计时器 然后 Sleep | 更新日期: 2023-09-27 17:56:56

我试图等待 20 秒,然后再向 i (Int) 添加 + 1 值,但我想在没有Thread.Sleep的情况下做到这一点.

这是我的代码,顺便说一下,我不是专业程序员。

private void Refresh_App_TimerNH_Tick(object sender, EventArgs e)
{
    label18.Text = "Timer Activated";
    int i = 0;
    i = i + 1;
    if (i == 16)
    {
        i = 0;
    }
    else
    {
    }
    if (i == 1)
    {
        webBrowser1.Refresh();
        userIdLabel1.BackColor = Color.Red;
        label20.Text = "+1";
     //**i want to add 20 second gap here**
        i = i + 1;
    }
    else
    {
    }
    if (i == 2)
    {
        webBrowser2.Refresh();
        userIdLabel2.BackColor = Color.Red;
        label20.Text = "+2";
        i = i + 1;
    }
    else
    {
    }
    if (i == 3)
    {
        webBrowser3.Refresh();
        userIdLabel3.BackColor = Color.Red;
        label20.Text = "+3";
        i = i + 1;
    }
    else
    {
    }
    if (i == 4)
    {
        webBrowser4.Refresh();
        userIdLabel4.BackColor = Color.Red;
        label20.Text = "+4";
        i = i + 1;
    }
    else
    {
    }
    if (i == 5)
    {
        webBrowser5.Refresh();
        userIdLabel5.BackColor = Color.Red;
        label20.Text = "+5";
        i = i + 1;
    }
    else
    {
    }
    if (i == 6)
    {
        webBrowser6.Refresh();
        userIdLabel6.BackColor = Color.Red;
        label20.Text = "+6";
        i = i + 1;
    }
    else
    {
    }
    if (i == 7)
    {
        webBrowser7.Refresh();
        userIdLabel7.BackColor = Color.Red;
        label20.Text = "+7";
        i = i + 1;
    }
    else
    {
    }
    if (i == 8)
    {
        webBrowser8.Refresh();
        userIdLabel8.BackColor = Color.Red;
        label20.Text = "+8";
        i = i + 1;
    }
    else
    {
    }
    if (i == 9)
    {
        webBrowser9.Refresh();
        userIdLabel9.BackColor = Color.Red;
        label20.Text = "+9";
        i = i + 1;
    }
    else
    {
    }
    if (i == 10)
    {
        webBrowser10.Refresh();
        userIdLabel10.BackColor = Color.Red;
        label20.Text = "+10";
        i = i + 1;
    }
    else
    {
    }
    if (i == 11)
    {
        webBrowser11.Refresh();
        userIdLabel11.BackColor = Color.Red;
        label20.Text = "+11";
        i = i + 1;
    }
    else
    {
    }
    if (i == 12)
    {
        webBrowser12.Refresh();
        userIdLabel12.BackColor = Color.Red;
        label20.Text = "+12";
        i = i + 1;
    }
    else
    {
    }
    if (i == 13)
    {
        webBrowser13.Refresh();
        userIdLabel13.BackColor = Color.Red;
        label20.Text = "+13";
        i = i + 1;
    }
    else
    {
    }
    if (i == 14)
    {
        webBrowser14.Refresh();
        userIdLabel14.BackColor = Color.Red;
        label20.Text = "+14";
        i = i + 1;
    }
    else
    {
    }
    if (i == 15)
    {
        webBrowser15.Refresh();
        userIdLabel15.BackColor = Color.Red;
        label20.Text = "+15";
        i = i + 1;
    }
    else
    {
    }
    if (i == 16)
    {
        webBrowser16.Refresh();
        userIdLabel16.BackColor = Color.Red;
        label20.Text = "+16";
        i = i + 1;
    }
    else
    {
    }
    Refresh_App_TimerNH.Stop();
    label18.Text = "Timer De-Activated";
    Refresh_App_TimerNH.Start();
}

我认为这可能很容易,但不适合我,因为我是 c# 的新手

在计时器中等待 20 秒,然后在没有 Thread.Sleep.C# 的情况下执行下一行

首先,Tim S的答案——把你的逻辑分解成更小的块,简化计时器逻辑——很好。但是要回答您的具体问题,即"如何在没有Sleep的情况下延迟语句之间的",是:使方法async,然后使用await Task.Delay(...)

你避免Sleep是对的;使用它是一种糟糕的编程实践,并且会挂起你的应用程序。 await Task.Delay执行异步等待 - 即,该方法立即返回,应用继续处理 UI 消息,延迟完成后,程序计划方法的其余部分稍后执行。

请注意,在异步等待期间,根据设计,消息会不断被处理。如果其中一条消息导致事件处理程序再次运行,那么您可能会陷入非常混乱的情况,即在同一非递归方法中具有多个控制点。 尽量避免这种情况。

现在你的逻辑很复杂,可能与你想要它做的事情大不相同。

如果您将某种列表中的webBrowserXuserIdLabelX项放在一起,您的代码会简单得多。

public class MyPair
{
    public WebBrowser WebBrowser { get; set; }
    public Label UserIdLabel { get; set; }
}
private List<MyPair> pairs;
private int refreshIndex = 0;
private void StartTimer()
{
    pairs = // populate pairs somehow
    refreshIndex = 0;
    var timer = new System.Windows.Forms.Timer();
    timer.Interval = 20000
    timer.Tick += MyTickHandler;
    timer.Start();
    label18.Text = "Timer Activated";
}
private void MyTickHandler(object sender, EventArgs e)
{
    pairs[refreshIndex].WebBrowser.Refresh();
    pairs[refreshIndex].UserIdLabel.BackColor = Color.Red;
    label20.Text = "+" + (refreshIndex + 1);
    refreshIndex = (refreshIndex + 1) % pairs.Count;
}

请注意,此计时器永远不会停用,它会重复遍历对列表。