在RunWorkerCompleted触发后,BackgroundWorker OnProgressChanged仍然触发

时间:2011-10-11 10:07:40

标签: c# progress-bar backgroundworker

我的应用程序使用BackgroundWorker将文件上传到FTP服务器。 一切正常,但似乎OnProgressChanged事件不能像它应该的那样工作。

我虽然在OnProgressChanged事件被触发后RunWorkerCompleted将完全完成,但事实并非如此。

在我的情况下,虽然OnProgressChanged被解雇,但{​​{1}}事件仍在触发。显然,我的进度条仍在继续,而我的文件已经完全发送到ftp服务器。

我在调试模式下进行了测试,发现在RunWorkerComplete被解雇后,RunWorkerCompleted仍在使用。

我的代码在这里。

OnPorgressChanged

关于这个问题的任何想法? 谢谢你们

1 个答案:

答案 0 :(得分:7)

这很可能是由原生进度条组件的Vista更新引入的工件引起的,也存在于Windows 7中。要查看它,请启动一个新的Winforms项目并在表单上放置一个进度条和一个按钮。双击该按钮,使Click事件处理程序如下所示:

    private void button1_Click(object sender, EventArgs e) {
        if (progressBar1.Value == progressBar1.Maximum) progressBar1.Value = progressBar1.Minimum;
        else progressBar1.Value = progressBar1.Maximum;
    }

按F5并单击按钮。请注意条形图动画,它从0平滑移动到100.大约需要一秒钟。

也许你现在看到了这个含义,这个动画产生了滞后。换句话说,可见值总是小于编程值,除非你给它足够的时间来赶上。你没有,你不断用ProgressChanged事件处理程序更新值。

不幸的是,他们忘了提供关闭此动画的选项。然而,有一个技巧,默认情况下,动画被禁用为减量。您可以做的是将Value属性设置两次,首先设置为值+ 1,然后设置为值。条形图立即跳转到编程值。唯一的缺陷就是你不能轻易跳到100%。