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

时间:2015-06-18 19:59:58

标签: c#

我想在向i(Int)添加+ 1值之前等待20秒,但我想在没有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#

的新手

2 个答案:

答案 0 :(得分:7)

首先,Tim S的回答 - 将你的逻辑分解成更小的块并简化定时器逻辑 - 很好。但要回答您的具体问题,即“我如何在没有Sleep的语句之间延迟”,请:制作方法async,然后使用await Task.Delay(...)

你应该避免Sleep;使用它是一种糟糕的编程习惯,并会挂起您的应用程序。 await Task.Delay执行异步等待 - 也就是说,该方法立即返回,应用程序继续处理UI消息,并且当延迟完成时,程序将该方法的其余部分调度为稍后执行。

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

答案 1 :(得分:3)

现在你的逻辑很复杂,可能与你想要它的完全不同。

如果将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;
}

请注意,此计时器从不停用,它会反复循环遍历对列表。