【问题标题】:Async Progress trouble with the Event Handler事件处理程序的异步进度问题
【发布时间】:2013-08-01 12:30:30
【问题描述】:

我正在尝试在我的程序中实现异步进度模式。但是我陷入了一个相当尴尬的境地:我无法分配事件处理程序。

我的代码如下所示: 该事件在一个额外的窗口中处理:

public ProgressReportViewModel(IWindowManager windManager, Progress<ProgressReport> progressReport)
{
    this.ProgressReport = progressReport;
    this.ProgressReport.ProgressChanged += HandleProgressChanged;
}

    public void HandleProgressChanged(ProgressReport report)
    {

// 做事。 }

如果我尝试编译,我会收到以下错误: “HandleProgressChanged”没有重载匹配委托“System.EventHandler”

为什么会出现这个错误?我对事件处理程序的理解是否存在缺陷?

【问题讨论】:

    标签: c# events asynchronous progress


    【解决方案1】:

    Progress&lt;T&gt;.ProgressChanged 事件有一个 EventHandler&lt;T&gt; 类型的委托,它具有以下签名:

    public delegate void EventHandler<TEventArgs>(
        Object sender,
        TEventArgs e
    )
    

    将您的代码更改为:

    public void HandleProgressChanged(Object sender, ProgressReport report)
    {
        // do stuff
    }
    

    【讨论】:

    • 谢谢,这就是答案!我有点困惑为什么微软的教程没有提到这一点......
    • @ChristianSauer 你能提供教程的链接吗?
    • 我使用了这个教程:blogs.msdn.com/b/dotnet/archive/2012/06/06/… 编码语法有点不同,但是 ReportProgress 签名没有 Sender 对象,似乎正在处理事件。
    • 在那篇文章的代码中,他们调用了Progress&lt;T&gt; constructor,它接受Action&lt;T&gt;,但如果你在构造事件后使用它,你的处理程序必须有Object sender参数。
    • 非常感谢。我不太熟悉 Action 概念,所以我不明白。
    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 2015-06-19
    • 2011-05-16
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多