如何正确使用委派的BackgroundWorker的ReportProgress方法? (BackgroundWorker.ReportProgress方法(Int32,Object))

时间:2017-08-31 12:10:18

标签: c# backgroundworker

我是O& M部门的工程师。为了使我的工作更轻松,我经常编写代码。我知道面向对象编程的基础知识,我熟悉C#。 我成功使用了它的2008版本。在我目前的项目中,我启动了十几个BackgroungWorkers,它们在DoWork中调用相同的(BackgrounfWorker_DoWork)方法。在线程的开头有一个委托部分,其中声明了必须调用哪个backgroundworker的ReportProgress方法(switch / case)。这个机制已经完美地工作,直到我将一个类(complex_data)的实例 - 其中声明了一个int,一个字符串和一个Bitmap变量 - 放到ReportProgress / delegate方法的第二个参数中。根据该理论,可以使用"参考值"作为ReportProgress / delegate方法的第二个参数 (我在这个网站上找到了这个:How to send more arguments in C# backgroundworker progressed changed event), 但是每次执行时都会得到一个例子:" ReportProgress(0,message);"线。 例外是:"类型' System.IndexOutOfRangeException'的第一次机会异常。发生在rdszm.exe中,            类型' System.Reflection.TargetInvocationException'的第一次机会异常。发生在mscorlib.dll" 我不明白我在哪里没有专注地使用一些索引。任何建议,帮助都会很好。谢谢。 乔治

public delegate void my_delegate_type_for_ReportProgress(int a, complex_data data);

public Form1()
{
    InitializeComponent();
    BackgroungWorker1.RunWorkerAsync("THREAD_1");
    BackgroungWorker2.RunWorkerAsync("THREAD_2");
    BackgroungWorker3.RunWorkerAsync("THREAD_3");
    BackgroungWorker4.RunWorkerAsync("THREAD_4");
    .
    .
    .
}


private void BackgrounfWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string name = (string)e.Argument;
    ANALIZE(name);
}

private void ANALIZE(string name)
{
    string str;
    complex_data message = new complex_data();



    my_delegate_type_for_ReportProgress ReportProgress = new my_delegate_type_for_ReportProgress(BackgroungWorker1.ReportProgress);

            switch (name)
            {
                case "THREAD_1":
                    ReportProgress = new my_delegate_type_for_ReportProgress(BackgroungWorker1.ReportProgress);
                    break;
                case "THREAD_2":
                    ReportProgress = new my_delegate_type_for_ReportProgress(BackgroungWorker2.ReportProgress);
                    break;
                case "THREAD_3":
                    ReportProgress = new my_delegate_type_for_ReportProgress(BackgroungWorker3.ReportProgress);
                    break;
                case "THREAD_4":
                    ReportProgress = new my_delegate_type_for_ReportProgress(BackgroungWorker4.ReportProgress);
                    break;
        .
        .
        .
                default:
                    break;
            }

            try
            {
                message.i = 0; message.str = ""; message.image_Bitmap = null;
                ReportProgress(0, message);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

        }
    }

public partial class complex_data
{
    public int i;
    public string str;
    public Bitmap image_Bitmap;
}

0 个答案:

没有答案