我有一个执行异步操作的类。 虽然该异步操作(可以下载文件),但它应该显示一个新的对话框。
要再次关闭该对话框并在其中显示进度,我会触发事件并让事件处理程序执行操作。
告诉你更清楚一点:
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:如果您有任何问题或某些事情不清楚,请问我。 ;)
答案 0 :(得分:2)
问题非常愚蠢。我没有#39;下载文件异步,所以不能以明确的方式提出任何事件。