代码之家  ›  专栏  ›  技术社区  ›  Amirshk

调用EventHandler泛型,TargetParameterCountException

  •  2
  • Amirshk  · 技术社区  · 14 年前

    我有一个directorymonitor类,它在另一个线程上工作。 声明了以下事件:

    public class DirectoryMonitor
    {
        public event EventHandler<MonitorEventArgs> CreatedNewBook;
        public event EventHandler ScanStarted;
        ....
    }
    
    public class MonitorEventArgs : EventArgs
    {
        public Book Book { get; set; }
    }
    

    有一个表单使用该监视器,在接收到事件时,它应该更新显示。

    现在,这个工作:

        void DirectoryMonitor_ScanStarted(object sender, EventArgs e)
        {
            if (InvokeRequired)
            {
                Invoke(new EventHandler(this.DirectoryMonitor_ScanStarted));
            }
            else {...}
        }
    

    但这一次 TargetParameterCountException :

        void DirectoryMonitor_CreatedNewBook(object sender, MonitorEventArgs e)
        {
            if (InvokeRequired)
            {
                Invoke(new EventHandler<MonitorEventArgs>(this.DirectoryMonitor_CreatedNewBook));
            }
            else {...}
        }
    

    我错过了什么?

    2 回复  |  直到 12 年前
        1
  •  2
  •   JaredPar    14 年前

    invoke方法接收 System.Delegate 可以在不传递任何附加参数的情况下调用的实例。使用创建的委托 DirectoryMonitor_ScanStarted 需要2个参数,因此在使用时会出现异常。

    您需要创建一个将调用和参数包装在一起的新委托。

    MethodInvoker del = () => this.DirectoryMonitor_ScanStarted(sender,e);
    Invoke(del);
    
        2
  •  0
  •   Richard Petheram    12 年前

    您缺少参数:

    void DirectoryMonitor_ScanStarted(object sender, MonitorEventArgs e)
        {
            if (InvokeRequired)
            {
                Invoke(new EventHandler<MonitorEventArgs>(DirectoryMonitor_ScanStarted), sender, e);
            }
            else {...}
        }
    

    出于我不清楚的原因(可能是由于COM遗留问题),允许在使用泛型事件时省略参数,但在使用用户定义的eventarg类型时不允许。