1

저는 VB 6에서 왔고 VB.NET에 준결승입니다. Windows Phone 8 응용 프로그램을 작성하고 있습니다. 파일 스트림에서 데이터를 동적으로 표시하려는 여러 textBlock이있는 표가 있습니다 (스캔 된 데이터 포함).WP8 textBlock을 변경할 때 "잘못된 크로스 스레드 액세스"

WP8 페이지가 열리면 자동으로 데이터가 textBlocks에로드됩니다. 이 작동합니다. 파일에서 데이터를로드하기 전에 모든 textBlock을 "재설정"하고 숨길 수 있습니다. 이를 위해 필자는 모든 textBlock에 대해 기본적으로 다음을 수행하는 절차를 사용하고자했습니다.

tbl1.Text = "" 
tbl1.Visibility = System.Windows.Visibility.Collapsed 

이것은 페이지가로드 될 때 정확히 한 번 작동합니다. 프로시 저는 오류를 생성하지 않습니다.

유형의 예외 '시스템 : 나중에 다시 메서드를 호출 할 때 나는 페이지에 표시된 데이터를 새로 고칠 때

지금, 나는 코드의 첫 번째 줄에 다음과 같은 오류가 위에 표시된 얻을 .UnauthorizedAccessException 'System.Windows.ni.dll에서 발생했지만 사용자 코드에서 처리하지 않았습니다. 추가 정보 : 잘못된 크로스 스레드 액세스.

나는 조금 잃었습니다. VB6에서는 UI 요소를 통해 원하는 모든 작업을 수행 할 수있었습니다. 나는 여기에 초보자 실수를하고 있다고 생각 하나?

일부 Dispatcher 내용을 읽었습니다. 그러나 단순히 textBlock의 값을 변경하는 것은 지나치게 복잡합니다. 간단한 방법이 없습니까?

+0

이 값을 변경하는 데 사용하는 방법은 무엇입니까? 비동기 적으로 실행됩니까? 그 방법으로 더 많은 코드를 보여줄 수 있습니까? – Romasz

+0

처음 페이지 생성자에서 호출됩니다. 그러나 직접적으로는 아닙니다. 비동기 하위 프로 시저에 있습니다. 스캐너가 데이터를받은 후 두 번째로 이벤트가 호출되었습니다. Private Sub oBCScanner_DataReceived (보낸 사람 객체, e As BarcodeScannerDataReceivedEventArgs) – Verun

+0

처음으로 이해했듯이 (페이지가로드 될 때) 작동합니다. 그럼 두 번째로 어디에서 호출합니까? 일부 빌드 - 인 (build-in) 메톤도 비동기 적으로 실행될 수 있습니다. – Romasz

답변

3

이 솔루션은 Dispatcher.BeginInvoke 방법을 사용하는 참이다.

Dispatcher.BeginInvoke(() => 
{ 
    tbl1.Text = "" 
    tbl1.Visibility = System.Windows.Visibility.Collapsed 
}); 

이유가 필요한 이유는 비 UI 스레드에서 UI 스레드에 종속 된 개체에 액세스하려고하기 때문입니다.

+0

이것은 작동한다. (다른 비슷한 대답 덕분에!) 위의 C# 코드를 사용하여 vb.net 형식으로이 작업을 수행 할 수있었습니다. 하위 프로 시저에서이 Dispatcher를 사용하여 UI에 파일 데이터를로드해야합니다. Me.Dispatcher.BeginInvoke (Sub() mLoadScannerData()) – Verun

1

UI 스레드에서 메서드를 호출하지 않았기 때문일 수 있습니다. Dispatcher.BeginInvoke 사용해보십시오 :

Dispatcher.BeginInvoke(()=> 
    { 
     tbl1.Text = ""; 
     tbl1.Visibility = System.Windows.Visibility.Collapsed; 
    }); 
관련 문제