独自旅行 发表于 2021-7-13 17:41

【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方法)
      }

commanderyuri 发表于 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

allenz3 发表于 2021-7-15 11:51

本帖最后由 allenz3 于 2021-7-15 11:56 编辑

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

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

hgfdsa 发表于 2021-7-15 11:57

首先不需要搞一个线程

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

独自旅行 发表于 2021-7-15 14:41

破案了!
问题根源不是多次触发——而是线程问题,或者是线程优先级问题。

       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();来进行全套流程,
而是新开启一个线程,强制让它在线程优先级上比流监控低。
这样在流监控相关操作任务完成后才会开启正式的任务进程。

独自旅行 发表于 2021-7-15 14:43

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

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

Prolun 发表于 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)的地方就别用委托了。
现在还保留委托,大部分 ...

问题是不用委托的话,流监视功能无法干涉主线程控件(文本框)。
页: [1]
查看完整版本: 【C#学习】流文件监视事件延迟执行,然后连续执行两次?