2017-05-09 7 views
1

어떤 이유로 ToolStrip의 ProgressBar 및 Label이 다른 스레드에서 업데이트되지 않습니다. 독서를 많이 한 후에도이 문제를 생각해 냈지만 여전히 작동하지는 않습니다 (버튼은 정상이지만 상태 표시 줄에는 없습니다).C# Toolstrip의 진행 막대 및 레이블이 크로스 스레드 작업에서 업데이트되지 않음

public void GdmReaderMessageEvent(object sender, GdmMessagesEventArgs e) 
    { 
     Console.WriteLine(e.Message); 

     // error or abort 
     if (e.Message.StartsWith("Error:") || e.Message.StartsWith("Aborted")) 
     { 

      // cross thread crap 
      if (pb.GetCurrentParent().InvokeRequired) 
       pb.GetCurrentParent().Invoke(new MethodInvoker(delegate { pb.Visible = false; })); 

      if (lblStatus.GetCurrentParent().InvokeRequired) 
       lblStatus.GetCurrentParent().Invoke(new MethodInvoker(delegate { lblStatus.Text = e.Message; })); 

      btnImport.Invoke(new MethodInvoker(delegate { btnImport.Text = "Import"; })); 

      //lblStatus.Text = e.Message; 
      //btnImport.Text = "Import"; 
      //pb.Visible = false; 
     } 
    } 

모든 기능이 수정되었지만 BGW 스레드의 콜백 일 뿐이므로 이미 분명하다고 생각했습니다. 만약 내가 그걸 사용한다면 :

 lblStatus.Text = e.Message; // this is a Label inside Status 
     btnImport.Text = "Import"; // this is just a button on Form 
     pb.Visible = false;   // this is a Progress Bar inside Status  

크로스 스레드 오류가 발생합니다. 그래서 Invoke()와 함께 사용되었습니다. 이제 CAN 버튼을 업데이트 할 수 있지만 상태 표시 줄의 모든 컨트롤은 업데이트 할 수 없습니다.

희망 사항이 더 분명합니다.

.NET 3.5, VS2008, Winforms를 사용합니다. 어떤 해결책이 있습니까?

+0

귀하의 플랫폼은 무엇입니까? winforms? wpf? webforms? 적절하게 태그하십시오. –

+2

조건을 부릅니까? 나는 그것이 이상한 질문이라는 것을 알고 있지만, 전체 기능을 보지 못했기 때문에 이미 호출하고 있거나 어떤 이유로 든 필요하지 않습니다 ... 버튼이 항상 작동한다고합니다 - InvokeRequired에 대해 버튼이 선택되어 있지 않습니다. .. 깨진 2 개가 있습니다. – Aaron

+1

Aaron이 (가) 아마도 귀하의 질문에 답변했습니다. 난 그냥 추가하고 싶습니다, 당신은 별도로 모든 컨트롤을 호출 할 필요가 없습니다. 호출은 컨트롤이 작성된 것과 동일한 스레드에서 포함 코드가 실행되도록합니다. 컨트롤을 이름으로 참조하여 폼 내부에있을 가능성이 높고 폼 또한 컨트롤이기 때문에 하나의'this.Invoke (...) '로 단순화하고 거기에 모든 GUI 업데이트 코드를 넣을 수 있습니다. – Fixation

답변

0

좋아, 찾았습니다. @Fixation, 가이드 덕분에 "this"(나는 양식 자체를 의미 함). 나는 작동하지 않는 컨트롤의 호출을 사용하려고했습니다.

또한,이 게시물은 unable to update progress bar with threading in C#

 this.BeginInvoke((Action)(() => pb.Visible = false)); 
     this.BeginInvoke((Action)(() => lblStatus.Text = e.Message)); 

그냥 완벽한 감사 유용했다.

관련 문제