별도 클래스의 다른 스레드에서 UI 업데이트
별도 클래스를 실행하는 스레드에서 WPF UI를 업데이트할 때 발생하는 일반적인 문제 . 계산 시간이 길어지면 UI가 멈추고 사용자에게 진행 상황을 알려주어야 합니다.
스레드와 이벤트를 사용한 솔루션
샘플 코드:
class MainWindow : Window { private void startCalc() { // Prepare input inputValues input = ...; // Create calculation class and register to its event CalcClass calc = new CalcClass(); calc.ProgressUpdate += (s, e) => Dispatcher.Invoke(() => { /* UI Update */ }); // Start calculation in a separate thread Thread calcthread = new Thread(new ParameterizedThreadStart(calc.testMethod)); calcthread.Start(input); } } class CalcClass { public event EventHandler ProgressUpdate; public void testMethod(object input) { // Raise event to trigger UI update if (ProgressUpdate != null) ProgressUpdate(this, new YourEventArgs(status)); // Notify UI with status updates } }
.NET 4.5 이상을 사용한 대안
다음을 고려하세요. 최신 버전을 사용하여 대안을 따르십시오. 기능:
작업 사용: 스레드를 작업으로 대체하여 스레드 관리를 단순화합니다.
Async/Await 사용: 계산을 연기할 때까지 연기 UI 업데이트 방법을 비동기식으로 표시하여 필요합니다.
강하게 사용 형식화된 일반 이벤트: 강력한 형식의 일반 이벤트를 사용하여 사용자 정의 데이터 유형을 이벤트에 전달합니다.
확장 기능을 사용한 개선된 예:
class MainWindow : Window { Task calcTask = null; // Stores task for later checking void StartCalc() { var calc = PrepareCalc(); calcTask = Task.Run(() => calc.TestMethod(input)); // Start in background } async Task CalcAsync() { var calc = PrepareCalc(); await Task.Run(() => calc.TestMethod(input)); // Await completion } CalcClass PrepareCalc() { // Prepare input and create calc object var calc = new CalcClass(); calc.ProgressUpdate += (s, e) => Dispatcher.Invoke(() => { /* UI Update */ }); return calc; } } class CalcClass { public event EventHandler<EventArgs<YourStatus>> ProgressUpdate; public TestMethod(InputValues input) { // Raise event to trigger UI update ProgressUpdate?.Raise(this, new EventArgs<YourStatus>(status)); // Raise with status } }
추가 참고:
위 내용은 다른 클래스의 별도 스레드에서 WPF UI를 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!