2012-04-25 30 views
0

我創建了一個線程來在我的應用程序中執行某些功能並在執行它時我想更新可見應用程序主窗體中的標籤給用戶。在應用程序正在處理另一個線程時更新主窗體標籤中的文本

我試圖通過函數返回字符串數據,我調用usinag seprate線程但它不起作用。

如果有任何解決方案在使用線程執行活動時更新標籤文本,請讓我知道。

class e2ertaData : e2erta1 
{ 
    public void rsData() 
    { 
     network networkDetails = new network(); 
     csv csvFile = new csv(); 
     ftpFile ftpData = new ftpFile(); 
     //Host Geo Data 
     string getIP = networkDetails.GetIP(); 
     string[] hostData = getIP.Split('~'); 
     GeoIP geoIPReq = new GeoIP(); 
     GeoIpData geoIPReqData = new GeoIpData(); 
     geoIPReqData = geoIPReq.GetMy(); 
     if (geoIPReqData.KeyValue["Error"].ToString() == "NO") 
     { 
      //Reading server names from XML file 
      XmlDocument thisXmlDoc = new XmlDocument(); 
      thisXmlDoc.LoadXml(ftpData.getConfigFile("server.xml")); 
      XmlNodeList xnList = thisXmlDoc.SelectNodes("/servers/server"); 
      //updating label in e2erta1 

      this.l1.Text = "daaaaaaaaaaa"; 
      this.l1.Visible = true; 
      this.l1.Refresh(); 
      foreach (XmlNode xn in xnList) 
      { 
       string rtNote = ""; 
       string requestedServer = xn["sname"].InnerText; 
       string rtGet = networkDetails.GetRT(requestedServer); 
       if (rtGet.Contains("Exception")) 
       { 
        rtNote = rtGet; 
        //MessageBox.Show(rtNote); 
       } 
       try 
       { 
        var row = new List<string> { rtGet, rtNote }; 
        ftpData.addToCSVFile(row); 
       } 
       catch (Exception c) 
       { 
        MessageBox.Show(c.ToString()); 
       } 
      } 
     } 
     else 
     { 
      MessageBox.Show("Geo data : " + geoIPReqData.KeyValue["Error"].ToString()); 
     } 
     //return null; 
    } 
} 

感謝,

函數naveed

+0

嘗試label.Refresh(),你也可以請一些代碼 – Habib 2012-04-25 12:22:56

+0

是'e2erta1'形式? – 2012-04-25 13:43:45

回答

2

還考慮使用BackgroundWorker組件。從工具箱

  1. 將BackgroundWorker的到表單
  2. 設置BackgroundWorker的財產WorkerReportsProgress爲true
  3. 訂閱的BackgroundWorker的事件DoWork的
  4. 訂閱的BackgroundWorker的事件ProgressChanged

內部DoWork的事件處理程序運行所有你在線程中做了什麼,並調用ReportProgress方法將進度傳遞給表單:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // reading server names from XML file   

    for (int i = 0; i < xnList.Count; i++) 
    { 
     XmlNode xn = xnList[i]; 
     // process node 

     // report percentage to UI thread 
     int percentProgress = (i+1)*100/xnList.Count; 
     backgroundWorker1.ReportProgress(percentProgress); 
    } 
} 

內ReportProgress事件處理程序僅值分配給標籤:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    label1.Text = e.ProgressPercentage.ToString(); 
} 

要啓動後臺處理呼叫backgroundWorker1.RunWorkerAsync();

UPDATE:您的代碼是不工作的,因爲管制只能從線程更新其創建它們(UI線程)。所以你應該使用Invoke在UI線程上執行更新功能。示例和說明可以找到here

+0

謝謝,我看着你共享的例子來解決我的問題。 – 2012-04-25 13:58:08

2

使用該從你的線程:

this.Invoke((MethodInvoker)delegate 
{ 
    label.Text = "..."; 
}); 

編輯:

您也可以使用Invoke之前測試IsHandleCreated屬性:

private void UpdateLabel(string text) 
{ 
    if (this.IsHandleCreated) 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      label.Text = text; 
     }); 
    } 
    else 
    { 
     label.Text = text; 
    } 
} 
+0

在創建窗口句柄之前,不能在控件上調用Invoke或BeginInvoke。 – 2012-04-25 12:36:03

+0

發佈您的一些代碼。在使用'Invoke'之前,您還可以測試[IsHandleCreated](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.ishandlecreated.aspx)屬性。 – 2012-04-25 13:29:54

+0

謝謝.....我解決了它,現在它正在工作:) – 2012-04-25 14:00:29

相關問題