2013-05-05 7 views
0

안녕하세요, 스레드를 실행하고 프로세스에서 UI를 업데이트하는 프로그램이 있습니다. .invokrequired를 안전한 스레딩에 사용했으며 모든 것이 정상적으로 실행되었습니다. 스레드 중 하나에서 다른 스레드 (ListBox2.Items(index)) 만든 목록 상자에서 항목의 값을 사용해야합니다 그리고 난 dim item1 as integer =ListBox2.Items(index) 함께 현재 일하고 있어요. 이제는 프로그램이 잘 실행되고 예외 나 오류 메시지가 표시되지 않지만 같은 줄의 시계를 추가하면 다음과 같은 메시지가 표시됩니다. + AccessibilityObject { "크로스 스레드 작업이 유효하지 않습니다. Control 'ListBox2' 생성 된 스레드보다. "} System.InvalidOperationException. 스레드에서 안전하게 목록 상자 항목 값 받기

은 정상인가? 다른 스레드에있는 목록 상자의 항목 값을 안전하게 얻을 수있는 방법이 있습니까?

+0

대리인을 사용하거나 배경 작업자 만 사용하십시오. – Codexer

+0

자세한 내용은 여기에서 확인할 수 있습니다. http://stackoverflow.com/questions/3969476/how-to-pass-a-variable-to-another-thread – Codexer

+0

위임자를 사용하여 (ListBox2) 값을 가져올 수 없습니다. 항목 (색인)). UI에 어떤 변경도 필요하지 않습니다. ListBox2.Items (인덱스)의 값을 스레드로부터 안전하게 얻고 싶습니다. – user2334436

답변

0

크로스 스레드 예외에 대한 질문에 대답하기 위해서는 정상적인 현상이며 사용자가 만든 스레드와 다른 스레드의 UI 요소에 액세스 할 수 없습니다. 이 문제를 해결하려면 control.invoke()를 사용하여 목록 상자를 만든 스레드에서 액세스 코드를 실행하는 람다 식을 실행해야합니다.

Dim item1 as Integer 
If ListBox2.InvokeRequired then 
    Listbox2.Invoke(Sub() Item1 = ListBox2.Items(Index)) 
Else 
    Item1 = ListBox2.Items(Index) 
End If