如何在Windows窗体应用程序中使用多线程来更新进度条?

时间:2010-04-07 21:23:15

标签: c# .net events multithreading handler

有两个对象。带有按钮和进度条的Windows窗体,以及处理算法的另一个对象。

在算法对象中有一个事件和一个属性。事件为ProgressChanged,属性为Progress(为int)。

在调用窗口中,该按钮从算法对象中的一组步骤开始。当每个步骤(或子步骤)发生时,会触发ProgressChanged事件,并且在窗口中有一个事件处理程序,它基本上相对于Progress属性递增进度条。

我遇到的问题是因为算法有可能(并且很可能)运行相对较长的时间,我需要将它移动到它自己的后台线程中并将事件推回到窗口。 / p>

我的问题是,在多线程方面,我并不完全确定我在做什么。我看了Control.Invoke,我有点失落。

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:3)

使用背景工作者。它有一个ReportProgress方法+事件,让你可以运行进度条而无需担心Invoke。

答案 1 :(得分:1)

以下是如何使用Invoke更改为UI线程的示例,其中可以安全地访问控件:

// In some form method, setup the event handler
algorithm.ProgressChanged += new EventHandler(AlgorithmProgressChanged);

private void AlgorithmProgressChanged(Object source, EventArgs args)
{
    if (this.InvokeRequired)
    {
        // Switch to the UI thread
        this.Invoke(new EventHandler(AlgorithmProgressChanged), source, args);
        return;
    }
    // It should be safe to set the progress beyond this point.
    progressBar.Value = algorithm.Progress;
}

答案 2 :(得分:0)

正如另一张海报所说,使用BackgroundWorker组件。解释和示例代码:http://ondotnet.com/pub/a/dotnet/2005/07/25/backgroundworker.html

-Oisin