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

问题描述:

我使用System.Windows.Forms.Timer显示传输文件更新进度(的timeleft,速度..等)Timer.Start()仅适用于第一次调用?

,我也用backgroundworker将文件发送

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

它只在第一次调用timer1.Strat时工作正常,但是当它再次调用后r 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)); 
     } 
    } 

它是怎么回事,我该如何解决它?

+0

sumAll是什么定义?你怎么知道它没有被召唤。你是否在调试模式下断点,它从不打? – 2012-03-10 04:07:39

+0

sumAll是sentBytes ..就像[512k]/23340K 不,我没有说它没有被调用...它叫但不工作..它给了我也不例外..只是标签不更新了。 – 2012-03-10 04:16:43

+0

也许如果你让文字变得更大胆,它会自行解决。 – 2012-03-10 04:17:00

我已经想通了,我用的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()时间,没必要“自动复位”。