FileSystemWatcher 怎么传参数到委托中?

黄大仙儿 2013-12-28 04:22:13

foreach (KeyValuePair<int, Pictures> list in pictureList)//遍历字典生成图片
{
if (GenTecPic(list.Value.datapath, list.Value.macropath, 0))
{
FileSystemWatcher watcher = new FileSystemWatcher();//设置监视器
watcher.Path = list.Value.datapath;
watcher.Changed += new FileSystemEventHandler(TecDat_Changed);
watcher.Created += new FileSystemEventHandler(TecDat_Changed);
watcher.EnableRaisingEvents = true;
list.Value.watcher = watcher;
}
}
timer_tecplot.Enabled = true;

委托:

void TecDat_Changed(object sender, FileSystemEventArgs e)
{

}

字典里有几个我就会建几个监视器,在TecDat_Changed中我需要得到别的参数来生成我的图片。
现在有2种想法,不知道哪个可以实现?
1.我想知道是哪个watcher,这样就可以在字典中根据watcher来找到其他数据了;
2.在上面中我想把list.Value.macropath作为参数能传给委托。

急啊!!
...全文
233 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小猪八Q 2013-12-30
  • 打赏
  • 举报
回复
引用 10 楼 wpfLove 的回复:
http://inchatter.codeplex.com/ 开源的即时通信插件,不过目前仅支持WPF,参考下吧
发错地方了
小猪八Q 2013-12-30
  • 打赏
  • 举报
回复
http://inchatter.codeplex.com/ 开源的即时通信插件,不过目前仅支持WPF,参考下吧
卧_槽 2013-12-30
  • 打赏
  • 举报
回复
引用 8 楼 wpfLove 的回复:
[quote=引用 7 楼 huang369509940 的回复:] [quote=引用 6 楼 wpfLove 的回复:] 事件处理中的sender就是FileSystemWatcher,你可以重写一个继承自FileSystemWatcher的类,添加一些属性保存你需要的信息,在事件中根据sender获取到Watcher,根据相应的属性就可以得到
sender怎么就是watcher了啊?它只有Equals,GetHashCode,GetType,ToString这四个函数呀。。。所以,怎么根据sender获取到watcher?[/quote] sender as FileSystemWatcher sender传入的是object的类型,实际上是一个FileSystemWatcher类型的[/quote] sender意思就是谁触发了这个事件,你可以看.net framework源码,在invork的时候,传递的是this,也就是他自己。
小猪八Q 2013-12-30
  • 打赏
  • 举报
回复
引用 7 楼 huang369509940 的回复:
[quote=引用 6 楼 wpfLove 的回复:] 事件处理中的sender就是FileSystemWatcher,你可以重写一个继承自FileSystemWatcher的类,添加一些属性保存你需要的信息,在事件中根据sender获取到Watcher,根据相应的属性就可以得到
sender怎么就是watcher了啊?它只有Equals,GetHashCode,GetType,ToString这四个函数呀。。。所以,怎么根据sender获取到watcher?[/quote] sender as FileSystemWatcher sender传入的是object的类型,实际上是一个FileSystemWatcher类型的
黄大仙儿 2013-12-30
  • 打赏
  • 举报
回复
引用 6 楼 wpfLove 的回复:
事件处理中的sender就是FileSystemWatcher,你可以重写一个继承自FileSystemWatcher的类,添加一些属性保存你需要的信息,在事件中根据sender获取到Watcher,根据相应的属性就可以得到
sender怎么就是watcher了啊?它只有Equals,GetHashCode,GetType,ToString这四个函数呀。。。所以,怎么根据sender获取到watcher?
黄大仙儿 2013-12-30
  • 打赏
  • 举报
回复
引用 9 楼 yuwenge 的回复:
[quote=引用 8 楼 wpfLove 的回复:] [quote=引用 7 楼 huang369509940 的回复:] [quote=引用 6 楼 wpfLove 的回复:] 事件处理中的sender就是FileSystemWatcher,你可以重写一个继承自FileSystemWatcher的类,添加一些属性保存你需要的信息,在事件中根据sender获取到Watcher,根据相应的属性就可以得到
sender怎么就是watcher了啊?它只有Equals,GetHashCode,GetType,ToString这四个函数呀。。。所以,怎么根据sender获取到watcher?[/quote] sender as FileSystemWatcher sender传入的是object的类型,实际上是一个FileSystemWatcher类型的[/quote] sender意思就是谁触发了这个事件,你可以看.net framework源码,在invork的时候,传递的是this,也就是他自己。[/quote] 哦~你这么说我就懂了~谢谢哈~
小猪八Q 2013-12-29
  • 打赏
  • 举报
回复
事件处理中的sender就是FileSystemWatcher,你可以重写一个继承自FileSystemWatcher的类,添加一些属性保存你需要的信息,在事件中根据sender获取到Watcher,根据相应的属性就可以得到
黄大仙儿 2013-12-29
  • 打赏
  • 举报
回复
刚才那个没贴好。。。

            foreach (KeyValuePair<int, Pictures> list in pictureList)//遍历字典生成图片
            {
                if (GenTecPic(list.Value.datapath, list.Value.macropath, 0))
                {
                    FileSystemWatcher watcher = new FileSystemWatcher();//设置监视器
                    watcher.Path = list.Value.datapath;
                    Pictures pic = new Pictures();
                    pic.datapath = list.Value.datapath;
                    pic.macropath = list.Value.macropath;
                    watcher.Changed+=new FileSystemEventHandler(pic.TecDat_Changed);
                    //watcher.Changed += delegate(object s, FileSystemEventArgs ev)
                    //{
                    //    UpdateMacro(list.Value.datapath, ev.Name, list.Value.macropath);
                    //    RunPython(list.Value.macropath);
                    //};
                    watcher.EnableRaisingEvents = true;
                    list.Value.watcher = watcher;
                }
            }
黄大仙儿 2013-12-29
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
最原始的(在.net1.1就支持的)是可以创建一个调用类型,例如
public class MytecProxy
{
   public string path;
   ......以及其它任何必要的参数

   public void TecDat_Changed(object sender, FileSystemEventArgs e)
   {
        //在这里,你就可以访问到所有参数             
   }
}
然后调用时写
MyTecProxy obj = new MyTecProxy();
obj.path = list.Value.macropath;
watcher.Changed += new FileSystemEventHandler(obj.TecDat_Changed);
这样,当事件处理方法执行时,你通过 obj.xxxx 赋值的参数全都可以取到。 在c#3.0中(好像是这个版本)出现了非常优雅的“匿名委托”写法,其中可以引用方法之前定义的变量。这就不用你自己去定义 MyTecProxy 类型了。你可以直接写
watcher.Changed += (s,e) =>
{
      这里直接写事件处理代码,可以直接调用 list.Value.macropath!
}code]

因为匿名委托,会自动创建类似于 MyTecProxy 的内部类型,会自动将委托方法中使用到的外部变量编译为这个注册方法的过程的一部分。

匿名委托非常优雅!
好吧,最后用这个原始的方法给解决了。 [code=csharp] foreach (KeyValuePair<int, Pictures> list in pictureList)//遍历字典生成图片 { if (GenTecPic(list.Value.datapath, list.Value.macropath, 0)) { FileSystemWatcher watcher = new FileSystemWatcher();//设置监视器 watcher.Path = list.Value.datapath; Pictures pic = new Pictures(); pic.datapath = list.Value.datapath; pic.macropath = list.Value.macropath; watcher.Changed+=new FileSystemEventHandler(pic.TecDat_Changed); //watcher.Changed += delegate(object s, FileSystemEventArgs ev) //{ // UpdateMacro(list.Value.datapath, ev.Name, list.Value.macropath); // RunPython(list.Value.macropath); //}; watcher.EnableRaisingEvents = true; list.Value.watcher = watcher; } }

        public class Pictures
        {
            public string macropath;//宏的路径
            public string datapath;//数据的目录
            public string jpegpath;//生成图片存放的路径
            public FileSystemWatcher watcher;//对应的监视器

            public Pictures()
            {

            }
            public Pictures(string m,string d,string j)
            {
                this.macropath = m;
                this.datapath = d;
                this.jpegpath = j;
            }
            public void TecDat_Changed(object sender, FileSystemEventArgs e)
            {
                UpdateMacro(datapath, e.Name, macropath);
                RunPython(macropath);
            }
        }
不过这样写确实很麻烦,不知道那个问题怎么能在匿名方法中解决?还希望能解答一下,好多学习学习,谢谢啦~
黄大仙儿 2013-12-29
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
你可以直接写
watcher.Changed += (s,e) =>
 {
       这里直接写事件处理代码,可以直接调用 list.Value.macropath!
}
看看匿名委托中引用外部变量的说明吧! 例如你可以写

if (GenTecPic(list.Value.datapath, list.Value.macropath, 0))
{
       FileSystemWatcher watcher = new FileSystemWatcher();//设置监视器
        watcher.Path = list.Value.datapath;
       watcher.Changed += (s,e) =>
       {
            OnWaterChanged(list.Value.datapath);
       }
......
也就是说在匿名方法中,你可以调用事先写好的另外一个方法,将来 Changed 事件触发时再把 list.Value.datapath 直接作为参数传给这个方法。
你这个是叫lambda表达式哈,非常感谢,告诉我这个还有匿名方法,但是我这现在还是有问题。

            foreach (KeyValuePair<int, Pictures> list in pictureList)//遍历字典生成图片
            {
                if (GenTecPic(list.Value.datapath, list.Value.macropath, 0))
                {
                    FileSystemWatcher watcher = new FileSystemWatcher();//设置监视器
                    watcher.Path = list.Value.datapath;
                    watcher.Changed += delegate(object s, FileSystemEventArgs ev)
                    {
                        UpdateMacro(list.Value.datapath, ev.Name, list.Value.macropath);
                        RunPython(list.Value.macropath);
                    };
                    watcher.Created += delegate(object s, FileSystemEventArgs ev)
                    {
                        UpdateMacro(list.Value.datapath, ev.Name, list.Value.macropath);
                        RunPython(list.Value.macropath);
                    };
                    watcher.EnableRaisingEvents = true;
                    list.Value.watcher = watcher;
                }
            }
假设我现在pictureList里有两个数据: (1)pictureList[0]:datapath:E:\project\bin\Debug\data (2)pictureList[1]:datapath:I:\GenJPEG\bin\Debug\data 现在我手动在E:\project\bin\Debug\data里面增加文件,打断点,我发现监视器里的list.Value.datapath却是I:\GenJPEG\bin\Debug\data,list.Value.macropath的值亦pictureList[1]里的,这怎么才能解决啊??? 这是Pictures类的定义:

        public class Pictures
        {
            public string macropath;//宏的路径
            public string datapath;//数据的目录
            public string jpegpath;//生成图片存放的路径
            public FileSystemWatcher watcher;//对应的监视器

            public Pictures()
            {

            }
            public Pictures(string m,string d,string j)
            {
                this.macropath = m;
                this.datapath = d;
                this.jpegpath = j;
            }
        }
这是字典的定义:

Dictionary<int, Pictures> pictureList = new Dictionary<int, Pictures>();
  • 打赏
  • 举报
回复
你可以直接写
watcher.Changed += (s,e) =>
 {
       这里直接写事件处理代码,可以直接调用 list.Value.macropath!
}
看看匿名委托中引用外部变量的说明吧! 例如你可以写

if (GenTecPic(list.Value.datapath, list.Value.macropath, 0))
{
       FileSystemWatcher watcher = new FileSystemWatcher();//设置监视器
        watcher.Path = list.Value.datapath;
       watcher.Changed += (s,e) =>
       {
            OnWaterChanged(list.Value.datapath);
       }
......
也就是说在匿名方法中,你可以调用事先写好的另外一个方法,将来 Changed 事件触发时再把 list.Value.datapath 直接作为参数传给这个方法。
  • 打赏
  • 举报
回复
最原始的(在.net1.1就支持的)是可以创建一个调用类型,例如
public class MytecProxy
{
   public string path;
   ......以及其它任何必要的参数

   public void TecDat_Changed(object sender, FileSystemEventArgs e)
   {
        //在这里,你就可以访问到所有参数             
   }
}
然后调用时写
MyTecProxy obj = new MyTecProxy();
obj.path = list.Value.macropath;
watcher.Changed += new FileSystemEventHandler(obj.TecDat_Changed);
这样,当事件处理方法执行时,你通过 obj.xxxx 赋值的参数全都可以取到。 在c#3.0中(好像是这个版本)出现了非常优雅的“匿名委托”写法,其中可以引用方法之前定义的变量。这就不用你自己去定义 MyTecProxy 类型了。你可以直接写[code=csharp]watcher.Changed += (s,e) => { 这里直接写事件处理代码,可以直接调用 list.Value.macropath! }code] 因为匿名委托,会自动创建类似于 MyTecProxy 的内部类型,会自动将委托方法中使用到的外部变量编译为这个注册方法的过程的一部分。 匿名委托非常优雅!

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧