找回密码
 立即注册
搜索
查看: 2012|回复: 10

[其他] 【C#学习】流文件监视事件延迟执行,然后连续执行两次?

[复制链接]
     
发表于 2021-7-13 17:41 | 显示全部楼层 |阅读模式
这东西搞得整个工具没法用了。
写入XML之后它不会马上刷新,而是等整个流程走完了它才刷新。
然后它的触发事件不仅仅是延迟执行,而且延迟后还执行了两次!
都搞不懂它的执行顺序了。

  1.         private Thread invokeThread;                //定义线程
  2.         private delegate void deleLOAD();           //定义一个委托【调用LoadXML()的委托】
  3.         private delegate void deleSetXML();         //定义一个委托【调用SaveToXML()的委托】
  4.         private delegate void dCloserTextBox();     //定义一个委托【调用CloserTextBox()的委托】,用于清空文本框

  5.        private void Form1_Load(object sender, EventArgs e)                    //预先载入内容
  6.         {
  7.             getTimeStr();                                                      //取得时间命名
  8.             LoadXML();                                                         //读取XML文件
  9.             txt_socpathtoRAR = str_opt + "\\SaveRAR.txt";                      //读取RAR用.源文件列表的物理地址
  10.             invokeThread = new Thread(new ThreadStart(UsingFileSystemWatcher));//使用线程来调用流文件监视方法()
  11.             invokeThread.Start();                                              //线程开始
  12.         }

  13.        void UsingFileSystemWatcher()   //流文件监视XML
  14.         {
  15.             FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
  16.             fileSystemWatcher.Path = Application.StartupPath;           //设置监控的文件目录
  17.             fileSystemWatcher.IncludeSubdirectories = false;            //设置监控目标目录下的所有子目录
  18.             fileSystemWatcher.Filter = "*.xml";                  //设置监控文件的类型
  19.             fileSystemWatcher.Changed += FileSystemWatcher_Changed;     //设置文件的文件名、目录名及文件的大小改动会触发Changed事件
  20.             fileSystemWatcher.EnableRaisingEvents = true;               //启动监控
  21.         }

  22.         void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e) //流文件监视法-触发Changed事件后执行的方法
  23.         {

  24.             //Invoke(newdCloserTextBox(CloserTextBox));                        //UI线程调用委托(清空文本框)
  25.             Invoke(new deleLOAD(LoadXML));                              //UI线程调用委托(读取XML方法)
  26.         }
复制代码


回复

使用道具 举报

头像被屏蔽
     
发表于 2021-7-13 19:20 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2021-7-14 10:05 | 显示全部楼层
本帖最后由 独自旅行 于 2021-7-15 11:40 编辑
commanderyuri 发表于 2021-7-13 19:20
firstly,不需要定义3个不同的委托类型,System.Action不好么

—— 来自 Xiaomi M2007J3SC, Android 11上 ...

谢谢谢谢。
这个方法教材上没说啊。教材过时了……

顺便问下委托的正确用法是啥?感觉上自定义委托延迟这么厉害那根本没有使用的意义了。
回复

使用道具 举报

     
 楼主| 发表于 2021-7-15 11:41 | 显示全部楼层
不行!!
今天重新测试了一下问题没有解决!!!
最后还是会延迟执行!
回复

使用道具 举报

头像被屏蔽
     
发表于 2021-7-15 11:47 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2021-7-15 11:51 | 显示全部楼层
本帖最后由 allenz3 于 2021-7-15 11:56 编辑

不太理解你要自己开一个新线程,FileSystemWatcher看名字应该会由库内部线程池管理监听和回调,而且通常来讲需要手动判断FileSystemEventArgs的种类

帮你看了下微软文档,https://docs.microsoft.com/zh-cn ... etypes?view=net-5.0,change回调是“文件或文件夹的更改。 更改的类型包括:大小、属性、安全设置、最近写入时间和最近访问时间方面的更改。”,所以当文件修改时它的大小和写入(访问)时间分别触发一次不足为奇
回复

使用道具 举报

发表于 2021-7-15 11:57 | 显示全部楼层
首先不需要搞一个线程

第二搞编程要学会搜索,搜索关键词 FileSystemWatcher changed 触发多次
回复

使用道具 举报

     
 楼主| 发表于 2021-7-15 14:41 | 显示全部楼层
破案了!
问题根源不是多次触发——而是线程问题,或者是线程优先级问题。

  1.        private void onlyRAR_Click(object sender, EventArgs e)  //仅压制RAR包,不发送FTP
  2.         {
  3.             savefile.save_rarName = rarName = str_group + "_" + str_job + "_" + strTime;         //几个区分词,合体成RAR包名字
  4.             savefile.save_rarFileName = rarFileName = str_opt + "\" + rarName;                       //RAR包全路径=输出文件夹+RAR包名字
  5.             SaveToXML();                                                                                                      //存入XML档案,用于后续的追加发送FTP
  6.             Thread Th = new Thread(new ThreadStart(DoRunToRAR));
  7.             Th.Start();
  8.         }
复制代码


我不再使用DoRunToRAR();来进行全套流程,
而是新开启一个线程,强制让它在线程优先级上比流监控低。
这样在流监控相关操作任务完成后才会开启正式的任务进程。
回复

使用道具 举报

     
 楼主| 发表于 2021-7-15 14:43 | 显示全部楼层
allenz3 发表于 2021-7-15 11:51
不太理解你要自己开一个新线程,FileSystemWatcher看名字应该会由库内部线程池管理监听和回调,而且通常来 ...

怪不得会变成多次触发……
回复

使用道具 举报

     
发表于 2021-7-16 07:04 | 显示全部楼层
独自旅行 发表于 2021-7-14 10:05
谢谢谢谢。
这个方法教材上没说啊。教材过时了……

委托的用法就是能用Lambda(System.Action,System.Func)的地方就别用委托了。
现在还保留委托,大部分情况下是为了兼容旧代码。就像是没有泛型的容器一样
回复

使用道具 举报

     
 楼主| 发表于 2021-7-18 18:18 | 显示全部楼层
Prolun 发表于 2021-7-16 07:04
委托的用法就是能用Lambda(System.Action,System.Func)的地方就别用委托了。
现在还保留委托,大部分 ...

问题是不用委托的话,流监视功能无法干涉主线程控件(文本框)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-15 04:51 , Processed in 0.076425 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表