我是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;
}