2011-11-28 84 views
1

有一個StatusProgressBar,通常從線程訪問。爲了確保這一點,它的Text屬性如下: -檢查/解決交叉線程操作

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


      prg.Text = value; 

     } 
    } 

而且prg.Text =值看起來像這樣

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(); 
     } 

    } 

現在的問題是,當其從UI線程訪問(有時) ,文字不變.. 前。

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的答案,它幾乎解決我的問題,但有一件事我要問 CrossThread(這一點,委託 { base.Text =值; },真正); } 這裏發佈了一條警告,指出「通過基關鍵字訪問文本導致無法驗證的代碼」 - 它是什麼 –

0

您是否在CrossThread方法中嘗試使用the following

Application.DoEvents(); 
+0

是的,Application.DoEvents();或bp.Refresh()解決了這個問題... 但我想問的警告: - CrossThread(this,delegate {base.Text = value;},true); }這裏發出警告,指出「通過基本關鍵字訪問文本導致無法驗證的代碼」 有什麼我做錯了[導致程序不穩定],請告訴我您如何編寫類似的訪問控件來自主題 –

+0

@AkshayVats:這個警告本身就說明了一切。您不應該通過'base'實例訪問'Text'屬性。警告告訴你編譯器不能確定你的對象上有一個'Text'屬性,因爲'base'沒有指出你正在工作的對象是什麼類型。 – Otiel

+0

我應該關心它嗎.. –