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;
      }
4

4 に答える 4

1

究極の解決策:これで何時間も探しました..どこからでも SetMSG(text) 関数を呼び出すことができます。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;
    }  
于 2012-11-11T14:29:51.437 に答える
1

技術的な理由により、あるスレッドで作成されたウィンドウとコントロールは、他のスレッドからアクセスできません。この問題を解決するには、コントロール アクセス操作 ( の取得と設定) を適切なスレッドに "転送" する必要があります。このスレッドは、WPF ではディスパッチャ スレッドTextと呼ばれます。

StatTextBox.Dispatcher.Invokeこれは、(同期的、つまり処理が完了するまで返らない) またはStatTextBox.Dispatcher.BeginInvoke(非同期的でパフォーマンスが向上する)を呼び出して実行します。

于 2012-08-01T07:52:31.720 に答える
0

Windowsフォームを使用している場合は、コントロールが作成された場所と同じスレッドからウィンドウコントロールにアクセスするか、マーシャリングを使用する必要があります。

このバリアントをコードで使用できます。

var lambda = () => StatTextBox.Text = "some text here" + "\n" + StatTextBox.Text;
if (StatTextBox.InvokeRequired)
{
    control.Invoke(lambda, new object[0]);
}
else
{
    lambda();
}
于 2012-08-01T07:58:02.517 に答える
0

これを試して:

    StatTextBox.Invoke((MethodInvoker)delegate()
    {
        StatTextBox.Text = "some text here" + "\n" + StatTextBox.Text;
    }
于 2012-08-01T07:51:00.597 に答える