以不同的时间间隔显示信息的文本框

本文关键字:信息 显示 文本 时间 | 更新日期: 2023-09-27 18:03:26

我已经创建了动态计时器。这需要不同的时间间隔。但是所有的信息都是一次性出现的。我希望每条信息都是在它的时间结束后才出现。

我该怎么做呢?

   private void btnTest_Click(object sender, EventArgs e)
    {
        for (int x = 0; x <= 5; x++)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.AutoReset=true;
            timer.Start();
            timer.Interval = ((x + 1) * 100);
            this.txtOutput.Text += "'r'r'n" + "  this out put equal to " + ((x + 1) * 100);
            Thread.Sleep((x + 1) * 100);
           this.txtOutput.Text += "'r'r'n" + "  Ends x " + x;

        }
    }

以不同的时间间隔显示信息的文本框

我想你用错定时器了。尝试使用System.Windows.Forms.Timer来代替,并使用实际的tick事件来执行您的逻辑:

var timer = new System.Windows.Forms.Timer();
int track = 0;
timer.Tick += (timerObject, timerArgs) => {
  timer.Interval = ((track + 1) * 100);
  this.txtOutput.Text += "'r'r'n" + " this out put equal to "
                                  + ((track + 1) * 100);
  ++track;
  if (track > 4) {
    timer.Stop();
    timer.Dispose();
    this.txtOutput.Text += "'r'r'n" + "  Ends x " + track.ToString();
  }
};
timer.Start();

首先,您必须在UI线程之外执行此操作,文本在返回off btnTest_Click方法后显示,当Thread.Sleep((x + 1) * 100);运行时,UI线程被冻结。

一种方法是使用BackgroundWorker,它会在另一个线程中运行DoWork事件中的代码。

但是,你必须小心,UI控件只能从UI线程访问,所以你必须使用表单的BeginInvoke方法。

使用BackgroundWorker:
private void btnTest_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerAsync();
    }
    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int x = 0; x <= 5; x++)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.AutoReset = true;
            timer.Start();
            timer.Interval = ((x + 1) * 100);
            this.BeginInvoke(new MethodInvoker(delegate
            {
                this.txtOutput.Text += "'r'r'n" + "  this out put equal to " + ((x + 1) * 100);
            }));
            Thread.Sleep((x + 1) * 100);
            this.BeginInvoke(new MethodInvoker(delegate
            {
                this.txtOutput.Text += "'r'r'n" + "  Ends x " + x;
            }));
        }
    }

在Windows窗体中可以这样做

for (var x = 0; x <= 5; x++)
{
    textBox1.Text += "'r'r'n" + "  this out put equal to " + ((x + 1) * 100);
    textBox1.Text += "'r'r'n" + "  Ends x " + x;
    Application.DoEvents();
    Thread.Sleep(200);
}
相关文章: