【C#学习】流文件监视事件延迟执行,然后连续执行两次?
这东西搞得整个工具没法用了。写入XML之后它不会马上刷新,而是等整个流程走完了它才刷新。
然后它的触发事件不仅仅是延迟执行,而且延迟后还执行了两次!
都搞不懂它的执行顺序了。
private Thread invokeThread; //定义线程
private delegate void deleLOAD(); //定义一个委托【调用LoadXML()的委托】
private delegate void deleSetXML(); //定义一个委托【调用SaveToXML()的委托】
private delegate void dCloserTextBox(); //定义一个委托【调用CloserTextBox()的委托】,用于清空文本框
private void Form1_Load(object sender, EventArgs e) //预先载入内容
{
getTimeStr(); //取得时间命名
LoadXML(); //读取XML文件
txt_socpathtoRAR = str_opt + "\\SaveRAR.txt"; //读取RAR用.源文件列表的物理地址
invokeThread = new Thread(new ThreadStart(UsingFileSystemWatcher));//使用线程来调用流文件监视方法()
invokeThread.Start(); //线程开始
}
void UsingFileSystemWatcher() //流文件监视XML
{
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
fileSystemWatcher.Path = Application.StartupPath; //设置监控的文件目录
fileSystemWatcher.IncludeSubdirectories = false; //设置监控目标目录下的所有子目录
fileSystemWatcher.Filter = "*.xml"; //设置监控文件的类型
fileSystemWatcher.Changed += FileSystemWatcher_Changed; //设置文件的文件名、目录名及文件的大小改动会触发Changed事件
fileSystemWatcher.EnableRaisingEvents = true; //启动监控
}
void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e) //流文件监视法-触发Changed事件后执行的方法
{
//Invoke(newdCloserTextBox(CloserTextBox)); //UI线程调用委托(清空文本框)
Invoke(new deleLOAD(LoadXML)); //UI线程调用委托(读取XML方法)
}
本帖最后由 独自旅行 于 2021-7-15 11:40 编辑
commanderyuri 发表于 2021-7-13 19:20
firstly,不需要定义3个不同的委托类型,System.Action不好么
—— 来自 Xiaomi M2007J3SC, Android 11上 ...
谢谢谢谢。
这个方法教材上没说啊。教材过时了……
顺便问下委托的正确用法是啥?感觉上自定义委托延迟这么厉害那根本没有使用的意义了。 不行!!
今天重新测试了一下问题没有解决!!!
最后还是会延迟执行! 本帖最后由 allenz3 于 2021-7-15 11:56 编辑
不太理解你要自己开一个新线程,FileSystemWatcher看名字应该会由库内部线程池管理监听和回调,而且通常来讲需要手动判断FileSystemEventArgs的种类
帮你看了下微软文档,https://docs.microsoft.com/zh-cn/dotnet/api/system.io.watcherchangetypes?view=net-5.0,change回调是“文件或文件夹的更改。 更改的类型包括:大小、属性、安全设置、最近写入时间和最近访问时间方面的更改。”,所以当文件修改时它的大小和写入(访问)时间分别触发一次不足为奇
首先不需要搞一个线程
第二搞编程要学会搜索,搜索关键词 FileSystemWatcher changed 触发多次 破案了!
问题根源不是多次触发——而是线程问题,或者是线程优先级问题。
private void onlyRAR_Click(object sender, EventArgs e)//仅压制RAR包,不发送FTP
{
savefile.save_rarName = rarName = str_group + "_" + str_job + "_" + strTime; //几个区分词,合体成RAR包名字
savefile.save_rarFileName = rarFileName = str_opt + "\\" + rarName; //RAR包全路径=输出文件夹+RAR包名字
SaveToXML(); //存入XML档案,用于后续的追加发送FTP
Thread Th = new Thread(new ThreadStart(DoRunToRAR));
Th.Start();
}
我不再使用DoRunToRAR();来进行全套流程,
而是新开启一个线程,强制让它在线程优先级上比流监控低。
这样在流监控相关操作任务完成后才会开启正式的任务进程。
allenz3 发表于 2021-7-15 11:51
不太理解你要自己开一个新线程,FileSystemWatcher看名字应该会由库内部线程池管理监听和回调,而且通常来 ...
怪不得会变成多次触发…… 独自旅行 发表于 2021-7-14 10:05
谢谢谢谢。
这个方法教材上没说啊。教材过时了……
委托的用法就是能用Lambda(System.Action,System.Func)的地方就别用委托了。
现在还保留委托,大部分情况下是为了兼容旧代码。就像是没有泛型的容器一样 Prolun 发表于 2021-7-16 07:04
委托的用法就是能用Lambda(System.Action,System.Func)的地方就别用委托了。
现在还保留委托,大部分 ...
问题是不用委托的话,流监视功能无法干涉主线程控件(文本框)。
页:
[1]