Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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#中的进程栏_C#_Multithreading_User Interface_Progress Bar - Fatal编程技术网

如何在另一个类中执行的另一个线程中更新c#中的进程栏

如何在另一个类中执行的另一个线程中更新c#中的进程栏,c#,multithreading,user-interface,progress-bar,C#,Multithreading,User Interface,Progress Bar,我正在处理windows窗体 我想从另一个线程更新进度条 此线程执行另一个类的代码 比如: 确切地说,我正在处理文件,并在“第二类”中逐个读取文件。如果对一个文件的处理完成,那么我想更新进程栏(整个进程在另一个线程而不是ui线程中运行)。我怎样才能做到这一点。 谢谢最好的方法是使用BackgroundWorker对象。有一个完整的代码示例说明如何使用它 否则,需要使用更新另一个类中的进度条。这将减轻您可能遇到的跨线程错误。如果您想自己调用,可以执行以下操作: //This goes in you

我正在处理windows窗体 我想从另一个线程更新进度条 此线程执行另一个类的代码 比如:

确切地说,我正在处理文件,并在“第二类”中逐个读取文件。如果对一个文件的处理完成,那么我想更新进程栏(整个进程在另一个线程而不是ui线程中运行)。我怎样才能做到这一点。
谢谢

最好的方法是使用
BackgroundWorker
对象。有一个完整的代码示例说明如何使用它


否则,需要使用更新另一个类中的进度条。这将减轻您可能遇到的跨线程错误。

如果您想自己调用,可以执行以下操作:

//This goes in your Form1
    private void button1_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(WorkThread);
        t.Start();
    }

    private void WorkThread()
    {
        DoSomeWork w = new DoSomeWork();

        w.Work();

        while (w.progress < 100)
        {
            UpdateFromThread(w.progress);
            Thread.Sleep(100);
        }
    }

    private void UpdateFromThread(int progress)
    {
        if (this.InvokeRequired)
        {
            MethodInvoker MyDelegate = delegate { UpdateFromThread(progress); };
            this.Invoke(MyDelegate);
        }
        else
        {
            progressBar1.Value = progress;
        }
    }

//Class to do some work.
class DoSomeWork
{

    public int progress { get; set; }

    public DoSomeWork()
    {
        progress = 0;
    }

    public void Work()
    {
        Thread t = new Thread(WorkThread);
        t.Start();
    }

    private void WorkThread()
    {
        for (int i = 0; i < 100; i++)
        {
            progress += 1;
            Thread.Sleep(250);
        }
    }
}
//这是您的表单1
私有无效按钮1\u单击(对象发送者,事件参数e)
{
螺纹t=新螺纹(工作螺纹);
t、 Start();
}
私有void工作线程()
{
DoSomeWork w=新的DoSomeWork();
w、 工作();
而(w.进度<100)
{
UpdateFromThread(w.progress);
睡眠(100);
}
}
私有void UpdateFromThread(int进程)
{
if(this.invokererequired)
{
MethodInvoker MyDelegate=委托{UpdateFromThread(progress);};
this.Invoke(MyDelegate);
}
其他的
{
progressBar1.值=进度;
}
}
//上课做一些工作。
课堂作业
{
公共int进程{get;set;}
公共档案工作()
{
进度=0;
}
公共工程()
{
螺纹t=新螺纹(工作螺纹);
t、 Start();
}
私有void工作线程()
{
对于(int i=0;i<100;i++)
{
进度+=1;
睡眠(250);
}
}
}

你没有具体说明你到底想做什么,但这是总体思路。后台工作人员绝对更干净

我尝试了这两种方法,但BackgroundWorker对象在另一个类中不起作用,invoke和begininvoke出现此异常“在创建窗口句柄之前,无法对控件调用invoke或begininvoke”。为什么要尝试更新尚未实例化的表单中的进度条?我向您展示了一些演示代码私有void按钮1\u单击(对象发送者,事件参数e){//wait Task.Run(()=>cnt());second a=new second();ThreadStart theprogress=new ThreadStart(a.cnt);Thread startprogress=new Thread(进程);startprogress.Name=“Update ProgressBar”;startprogress.Start();}public void UpdateProgress(){progressBar1.Value+=1;}class second{public void cnt(){Form1 af=new Form1();updatebar ast=new updatebar(af.UpdateProgress);int i=0;而(true){if(i%10==0){af.progressBar1.Invoke(ast);}if(i==100){break;}i++;Thread.Sleep(100);}}请不要将代码放在注释中。如您所见,这是不可能阅读的。请编辑您的问题。您不应该创建第二个线程只是为了定期更新进度。如果确实需要限制进度更新(通常不是这样)那么至少你应该使用一个计时器。首先,我想问你两件事,为什么你要在同一个线程中添加另一个线程?当我关闭表单时,我得到一个异常“无法访问已处理的对象”。在这一行“this.Invoke(MyDelegate);“好的,我明白了,这是工作,谢谢
//This goes in your Form1
    private void button1_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(WorkThread);
        t.Start();
    }

    private void WorkThread()
    {
        DoSomeWork w = new DoSomeWork();

        w.Work();

        while (w.progress < 100)
        {
            UpdateFromThread(w.progress);
            Thread.Sleep(100);
        }
    }

    private void UpdateFromThread(int progress)
    {
        if (this.InvokeRequired)
        {
            MethodInvoker MyDelegate = delegate { UpdateFromThread(progress); };
            this.Invoke(MyDelegate);
        }
        else
        {
            progressBar1.Value = progress;
        }
    }

//Class to do some work.
class DoSomeWork
{

    public int progress { get; set; }

    public DoSomeWork()
    {
        progress = 0;
    }

    public void Work()
    {
        Thread t = new Thread(WorkThread);
        t.Start();
    }

    private void WorkThread()
    {
        for (int i = 0; i < 100; i++)
        {
            progress += 1;
            Thread.Sleep(250);
        }
    }
}