Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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#_Winforms_Progress Bar_Backgroundworker - Fatal编程技术网

C# 如何访问不同类中的后台工作进程更改方法

C# 如何访问不同类中的后台工作进程更改方法,c#,winforms,progress-bar,backgroundworker,C#,Winforms,Progress Bar,Backgroundworker,我正在用C#创建一个windows窗体应用程序。在当前状态下,应用程序正在报告进度,但是我需要遵循一个类设计。我需要在一个静态类中使用三种不同的静态方法。据我所知,我不能遵循这个设计。我想在我的do work例程中实现MyUtilities.ProcessList() 目前,我的(请注意)代码如下: //form load private void Form1_Load(object sender, EventArgs e) { backgroundWorker1.WorkerRe

我正在用C#创建一个windows窗体应用程序。在当前状态下,应用程序正在报告进度,但是我需要遵循一个类设计。我需要在一个静态类中使用三种不同的静态方法。据我所知,我不能遵循这个设计。我想在我的do work例程中实现MyUtilities.ProcessList()

目前,我的(请注意)代码如下:

//form load
private void Form1_Load(object sender, EventArgs e)
{   
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
}

//calls the BG worker function
private void startWork()
{
    backgroundWorker1.RunWorkerAsync();
}

// update the progress bar
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // update progressbar
    progressBar1.Value = e.ProgressPercentage;
}


//the big crunch work
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

    /*
    This isn't my current code, but it should give an idea of my execution and how I currently report progress 
    There is no issues with my existing code in this section, this is just dummy code.
    */
    for (int i = 0; i <= 100; i++)
    {
        backgroundWorker1.ReportProgress(i);
        System.Threading.Thread.Sleep(100);
        percent = (i / 5)
        //20% of the full end task is done.
        backgroundWorker1.ReportProgress(percent);
    }

    //How do I access the report progress method if I'm in a different class???
    MyUtilities.ProcessList();

}
//表单加载
私有void Form1\u加载(对象发送方、事件参数e)
{   
backgroundWorker1.WorkerReportsProgress=true;
backgroundWorker1.ProgressChanged+=新的ProgressChangedEventHandler(backgroundWorker1\u ProgressChanged);
}
//调用BG worker函数
私人网络
{
backgroundWorker1.RunWorkerAsync();
}
//更新进度条
void backgroundWorker1\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
//更新进度条
progressBar1.值=e.ProgressPercentage;
}
//关键工作
无效backgroundWorker1\u DoWork(对象发送方,DoWorkerVentargs e)
{
/*
这不是我当前的代码,但它应该让我了解我的执行情况以及我当前如何报告进度
本节中我的现有代码没有问题,这只是一个伪代码。
*/

对于(inti=0;i,您可以将BackgroundWorker引用(或您建议的更抽象的对象)作为ProcessList方法的参数传递

MyUtilities.ProcessList(backgroundWorker1);
实现这一点的标准方法是使用,但通常在异步代码中使用

您还可以创建一个类而不是静态方法,并且该类的实例可以使用事件报告进度

public class ListProcessor
{
    public event EventHandler<ProgressChangedEventArgs> ProgressChanged;

    public void Process()
    {
        //...code logic
        if (ProgressChanged != null)
            ProgressChanged(this, new ProgressChangedEventArgs(1, this));
    }

}
公共类列表处理器
{
公共事件处理程序已更改;
公共程序()
{
//…代码逻辑
if(ProgressChanged!=null)
ProgressChanged(这个,新的ProgressChangedEventArgs(1,这个));
}
}

忽略我的最后一条评论,我通过了引用,它调用了reportProgress,它成功了!我想它已经订阅了……谢谢你!