【问题标题】:How can I use multithreading in a Windows Forms application to update a progress bar?如何在 Windows 窗体应用程序中使用多线程来更新进度条?
【发布时间】:2010-04-07 21:23:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# .net events multithreading handler


    【解决方案1】:

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

    【讨论】:

    • 这似乎是解决方案。谢谢!
    【解决方案2】:

    下面是一个如何使用 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;
    }
    

    【讨论】:

      【解决方案3】:

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

      -奥辛

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        • 2018-12-21
        • 1970-01-01
        相关资源
        最近更新 更多