【问题标题】:The calling thread cannot access this object because a different thread owns it "exception"调用线程无法访问此对象,因为另一个线程拥有它“异常”
【发布时间】:2012-11-11 22:29:51
【问题描述】:

在我的项目中,我有文本框,当事件触发 _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;
      }

【问题讨论】:

    标签: c# wpf exception


    【解决方案1】:

    由于技术原因,在一个线程中创建的窗口和控件不能从任何其他线程访问。要解决此问题,您必须将控制访问操作(获取和设置Text)“转发”到适当的线程,在 WPF 中称为 调度程序线程

    通过调用StatTextBox.Dispatcher.Invoke(同步,即在处理完成之前不返回)或StatTextBox.Dispatcher.BeginInvoke(异步并提供更好的性能)来执行此操作。

    【讨论】:

    • 感谢 Jon,但我不能在这里使用我的方法,因为它有一个参数 .. 抱歉我的英语不好
    • @tito11:当然可以,而且不仅限于一种方式。示例:StatTextBox.Dispatcher.Invoke(this.AddNewState, "some text here")。虽然代码可以使用一些重组。
    【解决方案2】:

    最终解决方案: 通过这个找了几个小时.. 您可以从任何地方调用 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;
        }  
    

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

        【解决方案4】:

        如果您使用 Windows 窗体,您应该从创建控件的同一线程访问窗口控件或使用编组。

        您可以在代码中使用此变体:

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

        【讨论】:

          猜你喜欢
          • 2011-02-13
          • 1970-01-01
          • 1970-01-01
          • 2022-01-13
          • 1970-01-01
          相关资源
          最近更新 更多