功能介绍:
在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;
}
在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;
}
解决方案 »
- c# 构造函数中赋值 readonly的困惑
- 跪求C# 第三方控件 DotNetBar 的中文教程
- switch...case...部分匹配的问题
- 哪位可不可以幫我解釋哈那個this 指針到底怎麽用?
- 看看这个循环怎么写?有点复杂
- 完成将当前文件夹(test)中的所有子文件中的文件移动到当前文件夹(test)中,并删除所有子文件夹,如何实现?
- 请帮助我,成批更新的操作的问题。急急急!
- C#调用C++写好的dll,dll导出的函数的参数是函数地址
- 我是初学者,求大神帮助
- 在C#中动态加入控件后,如何为控件的事件编写代码以响应事件???????
- Browsable如何动态改变值?
- rdlc报表如何在页脚加入合计,计算每页的合计值。
RunWorkerAsync
然后触发DoWork事件,最后触发RunWorkerCompleted事件!DoWork方法只执行了一次,并没有按照timer.interval的设定重复执行。你的代码中
timer1.Enabled = false;
你后面设置interval以后,有没有启用?就是这样,否则你怎么能触发timer?
timer1.Enabled = true;
ftpC.DisConnect();
timer1.Interval = 30000;
timer1.Enabled = true;
private void ThreadMethod()
{
while(true)
{
//处理代码
Thread.Sleep(1000);
}
}
功能是实现数据的上传,数据采集是随机的,但是不间断的。一天最多2000条记录吧。
补充,在DoWork中连接FTP,上传数据,timer_tick中调用dowork
2、在DoWork的事件响应代码中调用耗时的操作,此例中是PingIPs函数
3、在耗时操作中判断CancellationPending属性,如果为false则退出
4、如果要向用户界面发送信息,则调用BackgroundWorker的ReportProgress方法,它将调用ProgressChanged事件(可以将改变通过object类型传递)
5、在ProgressChanged事件的响应代码中将改变呈现给用户
6、如果需要取消耗时操作,则调用BackgroundWorker的CancelAsync方法,需要和步骤3一起使用
。
上传功能我已经实现了,问题是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();
}