2011-03-07 70 views
1

VS2005/Framework 2.0中得到GUI控件的属性值/ VB.NET如何从另一个线程

我使用一个BackgroundWorker控制做哪些更新一个模式的进度表格一些很长一段时间的工作(.ShowDialog()) 。

我从BW的DoWork/ProgressChanged事件设法SET主要形式的属性值,甚至调用窗体的方法(有一点点帮助,从反思的对象http://www.switchonthecode.com/tutorials/csharp-tutorial-using-reflection-to-get-object-information)。

我不知道该怎么做的唯一的事情就是GET主窗体控件的属性返回到BW线程。

+1

你能显示一些代码吗?反思可能不是这个工作的正确解决方案,你可能只需要一个InvokeRequired检查。 – SWeko 2011-03-07 08:14:27

回答

2

好,反射API中的所有set方法都有相应的Get方法,所以从示例代码可能是:

MyObject myObjectInstance = new MyObject(); 
System.Reflection.FieldInfo[] fieldInfo = myObjectType.GetFields(); 
string strValue = string.Empty; 
int intValue = 0; 
object objValue = null; 

foreach (System.Reflection.FieldInfo info in fieldInfo) 
{ 
    switch (info.Name) 
    { 
     case "myStringField": 
     strValue = (string)info.GetValue(myObjectInstance); 
     break; 
     case "myIntField": 
     intValue = (int)info.GetValue(myObjectInstance); 
     break; 
    case "myObjectField": 
     objValue = info.GetValue(myObjectInstance); 
     break; 
} 

然而,这是一种低效的方式获取/设置如果单个值你有很多的属性,所以你可以使用getfield命令的方法,像这样:

myType = myObjectInstance.GetType(); 
strValue = (string)myType.GetField("myStringField").GetValue(myObjectInstance); 
intValue = (int)myType.GetField("myIntField").GetValue(myObjectInstance); 
objValue = myType.GetField("myObjectField").GetValue(myObjectInstance); 

还有一两件事,反思是一个伟大的工具,但有一个代价。你的代码不易维护(毕竟,你使用字符串作为字段名称)并且性能受到严重伤害。我的底线是尽可能避免反思,所以请先尝试寻找替代解决方案。

+0

GetField方法线程安全吗?因为真正的问题是将返回的值传回给BackgroundWorker线程? – 2011-03-07 09:35:26

+0

使用反射并不安全,使用等效的对象,所以如果你有竞争条件没有反射,他们不会因为它而消失。请展示一些代码,因为我认为你完全不需要反思来实现你描述的场景。 – SWeko 2011-03-07 09:45:06