日期:2014-05-18  浏览次数:21125 次

backgroundworker与Timer联合使用问题
功能介绍:
  在DoWork方法里,连接FTP,上传文件,并设置timer.interval值。
  在timer_tick方法中,调用RunWorkerAsync()

问题:
  DoWork方法只执行了一次,并没有按照timer.interval的设定重复执行。

部分代码:
  定义全局变量backgroundworker bgwork;
  private void timer1_Tick(object sender, EventArgs e)
  {
  bgWork = new BackgroundWorker();
  bgWork.WorkerSupportsCancellation = true;
  bgWork.DoWork +=new DoWorkEventHandler(bgWork_DoWork);
  bgWork.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(bgWork_RunWorkerCompleted);
  bgWork.RunWorkerAsync();
  }
 
  public void bgWork_DoWork(object sender, DoWorkEventArgs e)
  {
  FTPClient ftpC = new FTPClient();
  timer1.Enabled = false;
  ............
  //连接FTP,上传文件,设置timer.interval=20000;
  }





------解决方案--------------------
1、调用BackgroundWorker的RunWorkerAsync方法(可以传递参数),它将调用DoWork事件
2、在DoWork的事件响应代码中调用耗时的操作,此例中是PingIPs函数
3、在耗时操作中判断CancellationPending属性,如果为false则退出
4、如果要向用户界面发送信息,则调用BackgroundWorker的ReportProgress方法,它将调用ProgressChanged事件(可以将改变通过object类型传递)
5、在ProgressChanged事件的响应代码中将改变呈现给用户
6、如果需要取消耗时操作,则调用BackgroundWorker的CancelAsync方法,需要和步骤3一起使用