2010-02-25 2 views
2

우리는 WPF 프로젝트를 가지고 있습니다. 다음과 같은 오류가 발생했습니다 :C# WPF 프로젝트, InvalidOperationException을 방지하는 방법?

InvalidOperationException was unhandled 
The calling thread cannot access this object because a different thread owns it. 

저는 작곡가에서 만든 작업 스레드에서 TextBox 값을 얻으 려합니다.

어떻게 피하십시오. delegate 콜백 및 Invoked() 메서드를 사용하여 다른 Form 프로젝트에서이 문제를 피할 수 있었지만 어떻게 든이 WPF 프로젝트에서 작동하지 않습니다.

간단한 샘플 코드? 덕분에

+0

또는 스레드 풀 스레드 - 그 텍스트 상자에서 텍스트를 취득하고자하는 경우 어떤 경우에, 그는 디스패처를해야하지만 ... 그것은 정말 아무튼 그가 쓰레기를 던지는 방법은 중요하지 않습니다. –

+0

http://stackoverflow.com/questions/1247269/wpf-event-threading-gui-updating-question, http://stackoverflow.com/questions/1261248/wpf-thread-and-gui-how-to-access -object-from-different-thread, http://stackoverflow.com/questions/1792129/multithreaded-access-to-the-wpf-gui-in-c, http://stackoverflow.com/questions/1862590/how -to-update-gui-with-backgroundworker – Lazarus

+0

스레드 ThreadPool에서 스레드 – 5YrsLaterDBA

답변

4

방법의 라인을 따라 뭔가에 대해 :

 if (!Dispatcher.CheckAccess()) 
     { 
      Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
      (MyDelegate)delegate 
      { 
       // Get value 
      }); 
     } 
     else 
     { 
      // Get value 
     } 
+0

내가이 오류가있어 : "TargetParameterCountException : 매개 변수 개수가 일치하지 않습니다. " 당신이 나를 도울 수? – Seva

+0

선언 한 위임자가 매개 변수를 사용하고 사용자가 매개 변수를 제공하지 않은 것으로 의심됩니다. 매개 변수가 필요하지 않은 경우 위의 "MyDelegate"대신 내장 된 "Action"델리게이트를 사용할 수 있습니다. – Gareth

5

처리하려면 Dispatcher를 사용해야합니다. Windows Forms에서와 같이 Control.Invoke를 사용하는 대신 이제 Dispatcher.Invoke 또는 Dispatcher.BeginInvoke을 사용하여 호출을 UI 스레드로 다시 정렬해야합니다.

관련 문제