2012-08-01 4 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 또는 WinForms? –

+0

@AdamHouldsworth WPF – tito11

답변

0

이 시도 : 기술적 인 이유로, 창문 및 하나 개의 스레드에서 만든 컨트롤에 대한

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

죄송합니다. 내 질문을 편집하십시오. – tito11

+0

WPF의 경우 Jon의 답변을 참조하십시오. – logicnp

1

는 다른 스레드에서 액세스 할 수 없습니다. 이 문제를 해결하려면 컨트롤 액세스 작업 ("Text 가져 오기 및 설정")을 적절한 스레드로 전달해야합니다.이 스레드는 디스패처 스레드이라고하는 WPF에서 발생합니다.

StatTextBox.Dispatcher.Invoke (동기식, 즉 처리가 완료 될 때까지 돌아 오지 않음) 또는 StatTextBox.Dispatcher.BeginInvoke (비동기식이며 더 나은 성능 제공)을 호출하여 수행합니다.

+0

Jon에게 감사하지만 매개 변수가 있기 때문에 여기서 내 방법을 사용할 수 없습니다. 내 나쁜 영어에 대해 유감입니다. – tito11

+0

@ tito11 : 물론 한 가지 방법 만이 아닙니다. 예 :'StatTextBox.Dispatcher.Invoke (this.AddNewState, "some text here")'. 코드가 약간의 구조 조정을 사용할 수는 있지만. – Jon

+1

Jon에게 감사하지만 오류가 발생합니다. http://www.freeimagehosting.net/r8e1b – tito11

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; 
    } 
관련 문제