2

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

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

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

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

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

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

4

3 回答 3

3

使用后台工作者。它有一个 ReportProgress 方法 + 事件,让您运行进度条而不用担心 Invoke。

于 2010-04-07T21:25:17.933 回答
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;
}
于 2010-04-07T21:35:30.973 回答
0

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

-Oisin

于 2010-04-07T21:27:51.687 回答