2012-08-01 47 views
0

在我的項目中我有文本框,當事件發生時_rtpAudioChannel_ChannelStateChanged我得到這個異常調用線程不能訪問這個對象,因爲一個不同的線程擁有它調用線程不能訪問這個對象,因爲不同的線程擁有它「異常」

 void _rtpAudioChannel_ChannelStateChanged(object sender, RtpStateChangedEventArgs<RtpChannelState> e) 
     { 
      AddNewState("some text here"); 
     } 


     public void AddNewState(string state) 
     { 
      StatTextBox.Text = state + "\n" + StatTextBox.Text; 
     } 
+0

WPF or WinForms? – 2012-08-01 07:49:35

+0

@AdamHouldsworth WPF – tito11 2012-08-01 07:51:36

回答

0

試試這個:

StatTextBox.Invoke((MethodInvoker)delegate() 
    { 
     StatTextBox.Text = "some text here" + "\n" + StatTextBox.Text; 
    } 
+0

對不起,我編輯我的問題 – tito11 2012-08-01 07:53:47

+0

對於WPF,請參閱Jon的答案。 – logicnp 2012-08-01 07:54:51

1

由於技術原因,窗戶和在一個線程創建的控件無法從其他線程訪問。爲了解決這個問題,你必須將控制訪問操作(獲取並設置Text)轉發給相應的線程,WPF中的線程稱爲調度程序線程

通過調用StatTextBox.Dispatcher.Invoke(它是同步的,即直到處理完成才返回)或StatTextBox.Dispatcher.BeginInvoke(它是異步的並提供更好的性能)來完成此操作。

+0

感謝喬恩,但我不能在這裏使用我的方法,因爲它有一個參數..對不起我的壞英語 – tito11 2012-08-01 08:01:25

+0

@ tito11:當然,你可以,而不僅僅是一種方式。例如:'StatTextBox.Dispatcher.Invoke(this.AddNewState,「這裏有一些文字」)'。雖然代碼可以使用一些重組。 – Jon 2012-08-01 08:07:36

+1

感謝喬恩,但給我一個錯誤http://www.freeimagehosting.net/r8e1b – tito11 2012-08-01 08:19:46

0

如果您使用Windows窗體,則可以從與創建控件的位置相同的線程或使用編組訪問窗口控件。

你可以在你的代碼中使用此變體:

var lambda =() => StatTextBox.Text = "some text here" + "\n" + StatTextBox.Text; 
if (StatTextBox.InvokeRequired) 
{ 
    control.Invoke(lambda, new object[0]); 
} 
else 
{ 
    lambda(); 
} 
1

的終極解決方案: 找小時這個.. 你可以調用從任何你想要的SetMSG(文本)功能。 ,它會將StatTextBox.Text設置爲文本。

public void SetMSG(string text){ 

     if (StatTextBox.Dispatcher.CheckAccess()) 
     { 
      StatTextBox.Text = text; 
     } 
     else 
     { 
      SetTextCallback d = new SetTextCallback(SetText); 
      StatTextBox.Dispatcher.Invoke(DispatcherPriority.Normal, d, text); 
     } 
    } 
    delegate void SetTextCallBack(string Text); 

    public void SetText(string text){ 
     StatTextBox.Text=text; 
    } 
相關問題