아래와 같은 질문이 있군요. ^^
UWP 앱에서 textBox로 클라에서 받은 값을 나타내고 싶은데 안되고 있습니다.
; https://www.sysnet.pe.kr/3/0/3659
질문자가 "익셉션 처리를 해봤는데, 에러가 안 났다"라고 쓴 것을 철석같이 믿었더니 질문/답변 란이 좀 복잡해졌습니다. ^^
일단, 원칙은 다음과 같이 간단합니다.
UI 요소를 접근하는 스레드는 반드시 그것을 생성한 스레드여야 합니다. 이것은 윈폼이든, WPF든, UWP 앱이든 모두 동일합니다. 만약 해당 UI 요소를 생성하지 않은 다른 스레드에서 접근하고 싶다면, 그 코드를 UI 요소를 생성한 스레드에 위임해야 합니다.
질문자는 StreamSocketListener 타입의 ConnectionReceived 이벤트 대응 메서드에서 UI 요소를 접근하려 했고 이 때문에 예외가 발생한 것입니다. 실제로 try/catch에서 메시지를 찍어보면 다음과 같이 나옵니다.
System.Exception: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
at Windows.UI.Xaml.Controls.TextBox.put_Text(String value)
at App1.MainPage.<SocketListener_ConnectionReceived>d__2.MoveNext()
암튼 UI 요소 접근은 두고두고 속을 썩이는군요. ^^
이를 해결하기 위해서는 다음의 Q&A에 있는 것처럼,
The application called an interface that was marshalled for a different thread in window 8
; http://stackoverflow.com/questions/11218911/the-application-called-an-interface-that-was-marshalled-for-a-different-thread-i
Dispatcher 타입의 RunAsync에 UI 접근 코드를 태워서 실행해야 합니다.
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
textBox.Text = request;
});
참고로 Dispatcher의 처리 방식은 다음의 글을 보시면 좀 더 쉽게 이해하실 수 있을 것입니다.
WPF - UI 업데이트를 바로 반영하고 싶다면?
; https://www.sysnet.pe.kr/2/0/747