功能介绍:
    在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.   

    正常的应该:
    RunWorkerAsync
    然后触发DoWork事件,最后触发RunWorkerCompleted事件!DoWork方法只执行了一次,并没有按照timer.interval的设定重复执行。你的代码中
    timer1.Enabled = false;
    你后面设置interval以后,有没有启用?就是这样,否则你怎么能触发timer?
    timer1.Enabled = true;
      

  2.   

    后面代码里有设置timer.enabled = true.
    ftpC.DisConnect();
                            timer1.Interval = 30000;
                            timer1.Enabled = true;
      

  3.   

    你在timer中再去run backgroundworker 可能不行,你希望实现什么效果?
      

  4.   

    直接使用Timer
    private void ThreadMethod()
    {
       while(true)
      {
         //处理代码
         Thread.Sleep(1000);
      }
    }
      

  5.   


    功能是实现数据的上传,数据采集是随机的,但是不间断的。一天最多2000条记录吧。
    补充,在DoWork中连接FTP,上传数据,timer_tick中调用dowork
      

  6.   

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

  7.   



    上传功能我已经实现了,问题是timer_tick只执行了一次就不再执行了。不知道什么原因。
    详细代码如下
       其中FTPClient为自定义类,实现连接FTP,文件上传功能。
         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;
                ftpC.RemoteHost = ConfigurationManager.AppSettings["host"];
                ftpC.RemotePort = int.Parse(ConfigurationManager.AppSettings["port"]);
                ftpC.RemotePath = ConfigurationManager.AppSettings["path"];
                ftpC.RemoteUser = ConfigurationManager.AppSettings["user"];
                ftpC.RemotePass = ConfigurationManager.AppSettings["pass"];
                try
                {
                    string file;
                    ftpC.Connect();
                    Application.DoEvents();
                    if (ftpC.Connected)
                    {
                        string[] files_weight = Directory.GetFiles(dir_weight);
                        string[] files_photo = Directory.GetFiles(dir_photo);
                        try
                        {
                            for (int i = 0; i < files_weight.Length; i++)
                            {
                                if (!IsFileInUse(files_weight[i]))
                                {
                                    file = files_weight[i].Substring(files_weight[i].LastIndexOf("\\") + 1);
                                    ftpC.Put(dir_weight, file);
                                    Application.DoEvents();
                                    File.Delete(files_weight[i]);
                                    Application.DoEvents();
                                }
                            }
                            ftpC.ChDir("photo");
                            for (int i = 0; i < files_photo.Length; i++)
                            {
                                if (!IsFileInUse(files_photo[i]))
                                {
                                    file = files_photo[i].Substring(files_photo[i].LastIndexOf("\\") + 1);
                                    ftpC.Put(dir_photo, file);
                                    Application.DoEvents();
                                    File.Delete(files_photo[i]);
                                    Application.DoEvents();
                                }
                            }
                        }
                        catch
                        {
                            ftpC.DisConnect();
                            timer1.Interval = 30000;
                            timer1.Enabled = true;
                        }                }
                    
                    ftpC.DisConnect();
                    timer1.Interval = 20000;
                    timer1.Enabled = true;
                }
                catch
                {
                    ftpC.DisConnect();
                    timer1.Interval = 30000;
                    timer1.Enabled = true;            }
              
            }        public void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                bgWork.CancelAsync();
            }
      

  8.   

    好像有点明白问题在哪了,dowork中设置了timer.interval值,但好像不能传递到timer_tick中,呵呵。希望是吧。