定时器+显示消息+不同的时间间隔

时间:2012-01-03 03:50:53

标签: c# timer

如何使用按钮以不同的时间间隔在C#表单应用程序上显示某些消息?

类似的东西:

private void button1_Click(object sender, EventArgs e)
{
      label1.Text = "string1";

      [wait 3 seconds]

      label1.Text = "string2";

      [wait 5 sec]

      label1.text="string 3";

      [end]
}

5 个答案:

答案 0 :(得分:2)

您可以创建新线程,更改标签文本,睡眠该线程等等:

using System.Threading;

// Somewhere in your Form, for example in Form_Load event:
new Thread(new ThreadStart(delegate {
    var d = new setLabelTextDelegate(setLabelText);
    label1.Invoke(d, new object[] { "string 1" });
    Thread.Sleep(3000); // sleep 3 seconds
    label1.Invoke(d, new object[] { "string 2" });
    Thread.Sleep(5000); // sleep 5 seconds
    label1.Invoke(d, new object[] { "string 3" });
})).Start();

private delegate void setLabelTextDelegate(string text);
private void setLabelText(string text)
{
    this.label1.Text = text;
}

答案 1 :(得分:1)

使用间隔为X毫秒的Timer,并更新每个Timer Tick的UI。跟踪收到的Timer Ticks的数量,以便您知道要使用的字符串。处理完每个更新后,停止计时器。

发布的其他解决方案可能更明智,但这个很简单。

Form1包含一个名为Label1的简单Label和一个名为Button1的按钮

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        t.Interval = 100;
        t.Tick += new EventHandler(t_Tick);
        t.Start();
    }

    Timer t = new Timer();
    int counter = 0;

    private void Button1_Click(object sender, EventArgs e)
    {
        t.Start();
    }

    void t_Tick(object sender, EventArgs e)
    {
        try
        {
            t.Enabled = false; //Disable timer so we don't start t_Tick when t_Tick is still runnnig

            if (counter == 0)
            {
                label1.Text = "string1";
                t.Interval = 3000;
            }
            if (counter == 1)
            {
                label1.Text = "string2";
                t.Interval = 5000;
            }
            if (counter == 2)
            {
                label1.Text = "string3";
                t.Stop(); //Stop timer
            }
            else
            {
                t.Enabled = true; //Resume timer
            }

            counter++;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Never throw exception from timer..." + ex.Message);
        }

    }

答案 2 :(得分:0)

完全按照您的伪代码建议,只需使用Thread.Sleep()代替[wait x]行。请注意,在等待期间,它可能会使UI无法响应。

或者,您可以创建一个执行相同操作但不阻止UI线程的线程。唯一的问题是你必须在UI线程中定义委托,否则它将不起作用。

private void button1_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(delegate()
    {
        label1.Text = "string1";
        Thread.Sleep(3000);
        label1.Text = "string2";
        Thread.Sleep(5000);
        //etc...
    });
}

答案 3 :(得分:0)

private void button1_Click(object sender, EventArgs e)
{

      label1.Text = "string1";
      System.Threading.Thread.Sleep(3*1000);
        label1.Text = "string2";
       System.Threading.Thread.Sleep(5*1000);
        label1.text="string 3";
}

答案 4 :(得分:0)

非常感谢你。

哦,我喜欢stakoverflow.com 我做了这样的事情。:) 谢谢所有温柔的男士:) 请评论我是怎么做的?我实际上希望这一切都发生在点击按钮。

  

public partial class mainForm:Form {           public mainForm()

     

Timer myTimer = new Timer();

     

private void button1_Click(object sender,EventArgs e)

    {
       myTimer.Tick += new EventHandler(myTimer_Tick);
       myTimer.Interval = 2000; 
       myTimer.Start();
    }
     

int counter = 0;

    void myTimer_Tick(object sender, EventArgs e)
    {

        if (counter == 0)
        {
            label4.Text = "string1";
            myTimer.Interval = 2000;
        }
        if (counter == 1)
        {
            label4.Text = "string2";
            myTimer.Interval = 2000;
        }
        if (counter == 2)
        {
            label4.Text = "string3";
            myTimer.Stop(); 
        }
        else
        {
            myTimer.Enabled = true; 
        }
        counter++;
      } }

我使用您提供的有价值的示例完成了所有工作。我把它们放在一起,让它按照我想要的方式工作。 再次感谢大家:)