2011-03-07 137 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