2012-04-25 1 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

+0

'e2erta1'은 양식입니까? –

답변

2

또한 BackgroundWorker 구성 요소를 사용해보십시오.

  • 사실
  • 로 설정합니다 BackgroundWorker에의 속성 WorkerReportsProgress가있는 BackgroundWorker의 이벤트에 가입 양식에 도구 상자에서

    1. 드래그 BackgroundWorker에는
    2. 에게 이

    내부 DoWork 이벤트 핸들러 모든 실행 ProgressChanged있는 BackgroundWorker의 이벤트를 구독 DoWork 스레드에서 무엇을하는지보고 양식을 진행하기 위해 ReportProgress 메소드를 호출하십시오.

    내부 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); 
        } 
    } 
    
    :

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

    배경 처리 호출을 시작하려면 backgroundWorker1.RunWorkerAsync();

    UPDATE : 컨트롤 만 스레드에서 업데이트 할 수 있기 때문에 귀하의 코드가 작동하지 않는 그들을 만들었습니다 (UI 스레드). 따라서 UI 스레드에서 업데이트 기능을 실행하려면 Invoke를 사용해야합니다. 예 및 설명은 here입니다.

  • +0

    고마워, 내 문제를 해결하기 위해 공유하는 예제를 들여다 보았다. –

    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를 호출 할 수 없습니다. –

    +0

    일부 코드 게시. Invoke를 사용하기 전에 [IsHandleCreated] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.ishandlecreated.aspx) 속성을 테스트 할 수도 있습니다. –

    +0

    고마워 ..... 나는 그것을 해결하고 그것이 작동하는 순간 :) –

    관련 문제