FileSystemWatcher是软件程序开发常用到的一个监控组件,但是这个控件的Changed 时间方法老是触发2次或者多次,触发多次的情况
2014-04-05 10:40
846 查看
FileSystemWatcher是软件程序开发常用到的一个监控组件,但是这个控件的Changed 时间方法老是触发2次或者多次,触发多次的情况主要是:
1,在事件执行中,文件又被自己的代码简介的改动,这种 情况,使用EnableRaisingEvents 数据进行开关就可以解决,这是大多数人的解决方法。
2,事件被触发两次(即使事件方法中没有代码,也被触发两次)。
我遇到的是第二种情况,在网上查看了大量解决方案,但是都没有找到能成功的。有的人使用HashTable 来记录文件更改情况,需要使用委托,开了写的代码,很繁琐。自己想了想,当前的情况是,两次触发了Changed事件,而且时间基本 是连续的,那么肯定文件的修改时间还没有改变(网上有人说,第二次触发,是系统对文件进行了改动,不知道是不是真的,总之触发了Changed 事件),既然这样,就可以对比两次改变时间是否相同来判断,是否是我们需要的Changed 那一次事件发生,不需要的,就屏蔽掉,不让其执行代码。思路就是这样,如下:
private DateTime dtTemp = System.IO.File.GetLastWriteTime("d:/temp/ws.dat");
private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)
{
DateTime dt = System.IO.File.GetLastWriteTime("d:/temp/ws.dat");
if (dtTemp.Equals(dt))
{
return;
}
dtTemp = dt;
int temp = new Random(3).Next(10);
int result = -1;
int id = Int32.Parse(DAL.getDsFromAccess("select max(id) from stu").Tables[0].Rows[0][0].ToString());
id += 1;
try
{
result = DAL.InsertToAccess("insert into stu values (" + id + "," + id + ",'ww',34,'wwww" + temp.ToString() + "')");
}
catch (System.Data.OleDb.OleDbException ex)
{
MessageBox.Show(ex.Message);
}
if (result < 0)
{
MessageBox.Show("error!!!!");
}
}
1,在事件执行中,文件又被自己的代码简介的改动,这种 情况,使用EnableRaisingEvents 数据进行开关就可以解决,这是大多数人的解决方法。
2,事件被触发两次(即使事件方法中没有代码,也被触发两次)。
我遇到的是第二种情况,在网上查看了大量解决方案,但是都没有找到能成功的。有的人使用HashTable 来记录文件更改情况,需要使用委托,开了写的代码,很繁琐。自己想了想,当前的情况是,两次触发了Changed事件,而且时间基本 是连续的,那么肯定文件的修改时间还没有改变(网上有人说,第二次触发,是系统对文件进行了改动,不知道是不是真的,总之触发了Changed 事件),既然这样,就可以对比两次改变时间是否相同来判断,是否是我们需要的Changed 那一次事件发生,不需要的,就屏蔽掉,不让其执行代码。思路就是这样,如下:
private DateTime dtTemp = System.IO.File.GetLastWriteTime("d:/temp/ws.dat");
private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)
{
DateTime dt = System.IO.File.GetLastWriteTime("d:/temp/ws.dat");
if (dtTemp.Equals(dt))
{
return;
}
dtTemp = dt;
int temp = new Random(3).Next(10);
int result = -1;
int id = Int32.Parse(DAL.getDsFromAccess("select max(id) from stu").Tables[0].Rows[0][0].ToString());
id += 1;
try
{
result = DAL.InsertToAccess("insert into stu values (" + id + "," + id + ",'ww',34,'wwww" + temp.ToString() + "')");
}
catch (System.Data.OleDb.OleDbException ex)
{
MessageBox.Show(ex.Message);
}
if (result < 0)
{
MessageBox.Show("error!!!!");
}
}
相关文章推荐
- FileSystemWatcher事件多次触发的解决方法
- FileSystemWatcher事件多次触发的解决方法
- FileSystemWatcher事件多次触发的解决方法 (C++版)
- FileSystemWatcher事件多次触发的解决方法
- c#实现数据同步的方法(使用文件监控对象filesystemwatcher)
- 减少等待时间:软件开发生命周期的一个“等待减少”程序
- 微信小程序开发关于分享功能中怎么定义同一个页面中不同的按钮触发不同的分享内容,或者右上角的分享和页面中分享
- FileSystemWatcher触发多次Change事件的解决办法
- C#使用FileSystemWatcher控件实现的文件监控功能示例
- c# FileSystemWatcher控件的使用方法
- FileSystemWatcher事件多次触发解决办法
- FileSystemWatcher控件监控目录
- 在C#.net中做页面上传的程序。用Dhtml的控件:(创建文件上载控件,该控件带有一个文本框和一个浏览按钮。)和类HtmlInputFile的两种方法
- 原因分析如下: 遇到这种情况,很有可能是把一个int型业务数据的 设置setText()或者类似的方法中, 这样Android系统就会主动去资源文件当中寻找, 但是它不是一个资源文件ID, 所
- C#中FileSystemWatcher控件实现文件监控
- c# FileSystemWatcherc# FileSystemWatcher控件的使用方法控件的使用方法
- FileSystemWatcher触发多次Change事件的解决办法
- 第一章-第四题(ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么?软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?这个游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素呢?有没有考虑到)--By梁旭晖
- 中国的大多数软件的一个bug和我眼中最保险的防止程序运行多次的方法
- 中国的大多数软件的一个bug和我眼中最保险的防止程序运行多次的方法