2010-03-18 8 views
2

주 응용 프로그램에 "목록"이 있는데 스레드 내에서 해당 요소에 액세스하려고합니다. { "다른 스레드가이 스레드를 소유하고있어이 스레드를 호출 할 수 없습니다."} System.SystemException {System.InvalidOperationException}스레드에서 액세스 목록 요소

답변

2
DispatcherOperation d = myListBox.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => 
{ 
    // access your listbox and return something 
})); 

그런 다음 반환 값

myValue = d.Result; //Result is of type Object 
+0

솔루션을 제공해 주셔서 감사합니다. 내 목록은 List 이며 메서드를 사용하여 n 번째 요소를 가져 오려고하면 응용 프로그램이 정지됩니다. – phm

+0

이 경우 UI 디스패처를 다음과 같이 복사하십시오. 디스패처 UIdispatcher = Dispatcher.CurrentDispatcher; 스레드를 시작하기 전에 이제 myListBox.Dispatcher 대신 스레드에서 UIdispatcher.Invoke (...)를 사용하십시오. Invoke 메서드를 호출하는 방법을 알려주실 수 있습니까? 나는 당신의 코드를 의미합니다. – Amsakanna

+0

BeginInvoke가 아닌 Invoke를 사용하십시오. d.Result를 원하는 유형으로 캐스트합니다. – Amsakanna

0

UI가 아닌 스레드에서 UI에 액세스하려고합니다. .

이 읽기 ​​: http://www.codeproject.com/Messages/2927256/Re-WPF-Delegates-The-calling-thread-cannot-access-.aspx

이을 : 당신은 대리자를 선언하여 크로스 스레드를 사용할 수 있습니다 http://www.switchonthecode.com/tutorials/working-with-the-wpf-dispatcher

+0

감사합니다,하지만 난 목록 멤버에 값을 설정할 수 있어요. Dispatcher를 사용하여 값을 검색하는 방법을 모르겠습니다. – phm

1

.

private delegate void thread_delegate(); 

그런 다음 방법을 만들고 목록에 액세스하는 모든 방법을 넣으십시오.

private void SampleMethod() 
{ 
.... 
} 

그런 다음 스레드에 대한 방법을 만드십시오. 그 방법 내부 은

당신이 당신의 스레드를 만들 명세서에
private void ThreadMethod() 
{ 

      thread_delegate d = new thread_delegate(SampleMethod); 
      d.Invoke(); 
} 

...

Thread t = new Thread(new ThreadStart(ThreadMethod));  
t.Start(); 
+0

이미이 방법을 시도했지만 작동하지 않습니다. 같은 예외가 발생했습니다 – phm

0
에 대한 귀하의 DispatcherOperation을 요구 할말을 테잎에 당신의 메소드를 호출

시도해보십시오.
MylistBox은 목록 상자

namespace TEST 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      Thread th = new Thread(AccessList); 
      th.Start(MylistBox); 
     } 

     void AccessList(Object O) 
     { 
      ListBox lBox = O as ListBox; 
      for (int i = 0; i < lBox.Items.Count; i++) 
      { 
       MessageBox.Show(lBox.Items[i].ToString()); 
      } 
     } 
    } 
}