2011-11-28 5 views
1

스레드에서 자주 액세스하는 StatusProgressBar가 있습니다.크로스 스레드 작업 확인/해결

[Browsable(true)] 
    public override string Text 
    { 
     get 
     { 
      return prg.Text ; 
     } 
     set 
     { 


      prg.Text = value; 

     } 
    } 

그리고 prg.Text = 값은 문제가, 그것의 UI 스레드에서 액세스 할 때 (가끔) 이제이

public override string Text 
    { 
     get 
     { 
      return base.Text; 
     } 
     set 
     { 

      Misc.CrossThread(this , delegate 
     { 

      base.Text = value; 
     }, true); 
     } 

public static void CrossThread(Control control, MethodInvoker d, bool forceSynchronous) 
    { 

     if (control.InvokeRequired) 
     { 
      if (forceSynchronous) 
      { 
       control.Invoke((Action)delegate { CrossThread(control, d, forceSynchronous); }); 
      } 
      else 
      { 
       control.BeginInvoke((Action)delegate { CrossThread(control, d, forceSynchronous); }); 
      } 
     } 
     else 
     { 
      if (control.IsDisposed) 
      { 
       throw new ObjectDisposedException("Control is already disposed."); 
      } 

      d(); 
     } 

    } 

과 같다 : -이을 보장하기 위해, Text 속성은 다음과 같다 , 텍스트가 변경되지 않습니다 .. ex.

if (cbGateway.SelectedIndex == -1) 
    { bp.Text = "Select GATEWAY"; return; } 

여기서 'bp'는 StatusProgressBar 개체를 나타냅니다. 내가

{ bp.Text = "Select GATEWAY"; return; } 

에 중단 점을 넣고 계속하면

지금, 모든 것이 예상대로 텍스트 변경 ... 왜 텍스트가 처음으로 변경되지 않습니다 어떻게됩니까?

답변

1

장기 실행 작업 중에 UI 스레드에서 진행률 막대에 액세스하면 장기 실행 작업이 완료 될 때까지 진행률 막대가 새로 고쳐지지 않습니다.

+0

질문을 읽어주십시오. –

+0

@PeterPAD : 질문을 읽었습니다. OP는 "이제 문제는 UI 스레드 (때로는)에서 텍스트에 액세스 할 때 텍스트가 변경되지 않는다는 것입니다."라고 말하면서 UI 스레드에서 오랫동안 실행중인 작업에서 업데이트를 호출 할 것이라고 생각했습니다. 힌트를주고 싶었다. ; 그래서 나는 당신의 downvoting 이해가 안 돼요 ... – Fischermaen

+0

Thnx는 대답을, 거의 내 문제를 해결하지만, (이, { base.Text = 값을} 위임 내가 크로스를 물어보고 싶은 한 가지가있다 참된); } "기본 키워드 결과를 통해 텍스트에 대한 액세스가 확인되지 않는 코드로 표시됩니다"라는 경고가 여기에 표시됩니다. - 무엇인가 –

0

CrossThread 방법에서 the following을 시도 했습니까?

Application.DoEvents(); 
+0

예, Application.DoEvents(); 또는 bp.Refresh()가 문제를 해결합니다 ... 하지만 경고에 대해 물어보고 싶습니다 : - CrossThread (this, delegate {base.Text = value;}, true); } 경고문이 출력됩니다. "기본 키워드를 통해 텍스트에 액세스하여 검증 할 수없는 코드가 나타납니다" 내가 잘못하고있는 것이 있습니까? [프로그램이 불안정해질 수 있습니다] 알려주십시오. 액세스되는 유사한 컨트롤을 작성한 방법 스레드에서 –

+0

@AkshayVats : 글쎄, 경고 자체에 대해 말한다. 'base' 인스턴스를 통해'Text' 속성에 접근해서는 안됩니다. 이 경고는'base'가 당신이 작업하고있는 객체의 타입을 나타내지 않기 때문에 컴파일러가 객체에 존재하는'Text' 속성이 있는지를 확신 할 수 없다는 경고입니다. – Otiel

+0

내가 신경 써야 할 .. –

관련 문제