Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Windows窗体应用程序中使用多线程更新进度条?_C#_.net_Events_Multithreading_Handler - Fatal编程技术网

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

C# 如何在Windows窗体应用程序中使用多线程更新进度条?,c#,.net,events,multithreading,handler,C#,.net,Events,Multithreading,Handler,有两个对象。Windows窗体包含一个按钮和一个进度条,以及另一个处理算法的对象 在算法对象中有一个事件和一个属性。事件是ProgressChanged,属性是Progress(它是一个int) 在调用窗口中,按钮启动算法对象中的一组步骤。当每个步骤(或子步骤)发生时,ProgressChanged事件将激发,并且在窗口中有一个事件处理程序,该事件处理程序基本上相对于progress属性递增进度条 我遇到的问题是,由于算法有可能(而且可能性很高)运行相对较长的时间,我需要将其移动到它自己的背景线

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

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

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

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

我的问题是,当涉及多线程时,我不能完全确定我在做什么。我已经看过
控件。调用
了,我有点不知所措


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

请一位幕后工作人员。它有一个ReportProgress method+事件,让您运行progressbar,而不必担心调用。

正如另一张海报所说,使用BackgroundWorker组件。关于以下内容的说明和示例代码:


-Oisin

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

看来这就是解决办法。谢谢