c# - 调用 EventHandler 泛型,TargetParameterCountException

标签 c# generics invoke event-handling

我有一个在另一个线程上工作的 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 {...}
    }

我错过了什么?

最佳答案

Invoke 方法除了接收 System.Delegate 实异常(exception),无需传递任何其他参数即可调用该实例。使用 DirectoryMonitor_ScanStarted 创建的委托(delegate)需要 2 个参数,因此在使用时会出现异常。

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

MethodInvoker del = () => this.DirectoryMonitor_ScanStarted(sender,e);
Invoke(del);

关于c# - 调用 EventHandler 泛型,TargetParameterCountException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2484226/

相关文章:

c# - JsonArray.Parse(...) 错误

c# - 将文件写入 Web 服务器 - ASP.NET

泛型数组的快速扩展

java - 在参数中使用泛型集合

Java Generics - 插入内部类型参数

c# - 我应该使用 Invoke 还是 SynchronizationContext 从另一个线程更新表单控件?

python - 执行在不同虚拟环境/venv 下构建的 python 脚本?

c# - 从辅助线程 : is Invoke performance critical? 更新控件

c# - 此命名空间冲突是由于 XAML 到 .NET 代码生成中的错误造成的吗?

c# - 不熟悉这个 ASP.NET/webform 类的名称