我有这个班级
class data_
{
public string string_data;
public int index_data;
public data_(string s,int i)
{
string_data = s;
index_data = i;
}
}
现在我将此类作为
中的对象传递public partial class Form1:Form
{
private void Button1_Click(object sender, EventArgs e)
{
int index =0;
foreach(string line in File.ReadLines("data"))
{
Threadpool(new WaitCallBack(execute,new data_(line,index))); // I am passing the class as an object here
++index;
}
}
private void execute(object processed_data)
{
string text = processed_data.string_data; //error
int index = processed_data.index_data; //error
// work and work
}
}
正如您所看到的,类data_
有2个可以使用的公共变量,我在开始一个帖子时分配它们的值,但我不能processed_data.string_data
或{{1}因为它作为一个对象传递,而WaitCallBack只接受对象,没有别的。那么如何在processed_data.index_data
void中访问processed_data
2个变量?(因为看起来我将这个类作为对象传递后,这2个变量就消失了)
答案 0 :(得分:2)
进入新方法后,您可以将对象强制转换为原始类型。
private void execute(object processed_data)
{
var data = (data_)processed_data;
}
当然,如果您打算这样做,那么您可以将方法参数设置为正确的类型。
答案 1 :(得分:2)
由于您至少使用的是.NET 4(请参阅File.ReadLines
),因此您既不需要输入,也不需要ThreadPool
/ Thread
。
假设一行的数据处理独立于另一行,您可以使用Parallel.ForEach
:
private void Button1_Click(object sender, EventArgs e)
{
Parallel.Foreach(File
.ReadLines("data")
.Select((line, index) => new data_(line, index)), execute);
}
private void execute(data_ processed_data)
{
// work and work
}
ForEach
将在内部使用ThreadPool
,但它会为您执行此操作,您将按原样传递参数,而无需在以后投射它们。
要了解秘密会发生什么,我建议您从这些链接开始:
=>
)Select
)Parallel.ForEach
)。