-4
의 스레드 C# 작업 밖에있는 WPF 데이터는 어떻게 편집해야합니까? 표준 WPF 템플릿을 사용하여 UI를 정의했습니다. 그리드는 포함UI 업데이트 코드
내 코드에서<TextBlock x:Name="myTextBox" Text="Original Text" />
내가 가진 : 다른 스레드가 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다
:
using System.Threading.Tasks; using System.Windows; namespace UpdateGUI { public partial class MainWindow : Window { private int myInt; public MainWindow() { InitializeComponent(); myInt = 0; Task.Factory.StartNew(() => { myInt++; myTextBox.Text = "New Text"; }); } } }
이것은 다음과 같은 예외가 발생합니다 .
어떤 스레드가 myTextBox를 소유합니까? myInt를 편집 할 때 왜이 오류 메시지가 표시되지 않습니까?
UI 스레드 만 UI 요소를 업데이트해야합니다. 다른 스레드가 UI를 업데이트해야하는 경우 UI 스레드에 요청해야합니다. 이를 수행하는 한 가지 방법은 [Dispatcher 클래스] (https://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke (v = vs.110) .aspx)를 사용하는 것입니다. –
또는 양방향 바인딩 메커니즘을 사용할 수 있습니다. 텍스트 상자를 모델의 속성에 바인딩하면 모델을 업데이트 할 수 있습니다. 그러면 모델이 자동으로 업데이트됩니다. – rmcsharry
샘플 코드의 문제점은 너무 단순하여 다른 스레드를 시작할 필요가 없다는 것입니다. 스레드를 생성하는 이유를 설명하는보다 구체적인 필요성이있는 경우 더 구체적으로 안내 할 수 있습니다. – sstan