Eventhandler不会开火

时间:2014-05-13 16:15:20

标签: c# winforms

我有一个执行异步操作的类。 虽然该异步操作(可以下载文件),但它应该显示一个新的对话框。

要再次关闭该对话框并在其中显示进度,我会触发事件并让事件处理程序执行操作。

告诉你更清楚一点:

var dialog = new DownloadDialog();
DoAsyncDownload();
if (dialog.ShowDialog() == DialogResult.OK)
{
   dialog.Close();
   // Go on
}

因此,下载对话框就是向用户显示正在进行下载。 为了显示进度并再次关闭对话框,我想基于事件进行工作。 我做的是一个事件:

public event EventHandler<EventArgs> DownloadFinished();

protected virtual void OnDownloadFinished(Object sender, EventArgs e)
{
    if (DownloadFinished != null) DownloadFinished(sender, e);
}

好吧,所以在名为async的方法中,我这样调用它,当下载文件时:

OnDownloadFinished();

然后这个事件被解雇了。 因此,为了使对话框接收到这个事件,我在对话框的类中设置了一个具有正确签名的处理程序。

然后我像这样设置这个处理程序:

this.DownloadFinished += new EventHandler<EventArgs>(dialog.DownloadFinishedHandler);

但事件处理程序永远不会执行其代码。 :( 我用断点检查了这个。

我认为问题是使用webclient下载文件。它的事件处理程序没有在我认为合适的时间设置。

webclient被声明为任何函数或任何东西之外的成员,因此每个函数都可以访问它。

然后,名为async的方法中的代码如下所示:

packageDownloader.DownloadFile(MyUrl, "Url");   
OnPackageDownloadFinished(this, EventArgs.Empty);

就像我上面已经说过的那样,这个函数被称为。 随着进度的变化出现同样的问题,它也是一样的。

我确信这有什么办法可行或者webclient是有罪的人,我已经用另一种方法完成了同样的事情,并且调用了事件处理程序,一切正常。所以在另一种方法中,另一件事情已经完成,但之后它也引发了一个事件。并且处理程序集完全相同。

只有在这里它不起作用,我认为它是webclient。

PS:如果您有任何问题或某些事情不清楚,请问我。 ;)

1 个答案:

答案 0 :(得分:2)

问题非常愚蠢。我没有#39;下载文件异步,所以不能以明确的方式提出任何事件。