Timer.Start()仅适用于第一次调用?

时间:2012-03-10 04:00:50

标签: c#

我正在使用System.Windows.Forms.Timer来显示传输文件更新进度(timeleft,speed ..etc)

我还使用backgroundworker发送文件

  • backgroundWorker1_DoWork来电timer1.Start();
  • backgroundWorker1_RunWorkerCompleted来电timer1.Stop();

仅在timer1.Strat的第一次调用中正常工作,但在timer1.Stop()之后再次调用时才能正常工作。它不起作用。

timer1.Enabled = True; 
timer1.Interval = 1000;
private void timer1_Tick(object sender, EventArgs e)
    {
        long speed = sumAll - prevSum;
        prevSum = sumAll;
        labelSpeed.Text = CnvrtUnit(speed) + "/S";
        if (speed > 0)
        {
            totalSeconds++;
            labelTime.Text = FormatRemainingText(TimeSpan.FromSeconds((sizeAll - sumAll) / speed));
            labelTotalTime.Text = FormatRemainingText(TimeSpan.FromSeconds(totalSeconds));
        }
    }

它有什么问题,如何解决?

1 个答案:

答案 0 :(得分:2)

我已经弄明白了,我使用的是System.Timers.Timer而不是System.Windows.Forms.Timer

System.Timers.Timer timer1 = new System.Timers.Timer(1000);

在类构造函数中,我添加了:

    public FileTransfer()
    {
        InitializeComponent();
        timer1.Elapsed += timer1_Tick;
    }


    private void timer1_Tick(object sender, EventArgs e)
    {
        long speed = sumAll - prevSum;
        Console.WriteLine(speed);
        prevSum = sumAll;
        Speed(CnvrtUnit(speed) + "/S");
        if (speed > 0)
        {
            totalSeconds++;
            Timeleft(FormatRemainingText(TimeSpan.FromSeconds((sizeAll - sumAll) / speed)));
            TotalTime(FormatRemainingText(TimeSpan.FromSeconds(totalSeconds)));
        }
    }

    private void Timeleft(string value)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action<string>(Timeleft), new object[] { value });
            return;
        }
        labelTime.Text = value;
    }
    private void TotalTime(string value)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action<string>(TotalTime), new object[] { value });
            return;
        }
        labelTotalTime.Text = value;
    }
    private void Speed(string value)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action<string>(Speed), new object[] { value });
            return;
        }
        labelSpeed.Text = value;
    }

现在每次拨打timer1.Start()时都可以使用,无需“自动重置”。