다른 클래스의 백그라운드 작업에서 UI를 업데이트하는 방법
백그라운드 작업은 UI를 정지하지 않고도 긴 작업을 실행할 수 있습니다. 그러나 이러한 작업에서 UI를 업데이트하려면 크로스 스레드 메커니즘이 필요합니다. 이 문서에서는 이벤트와 대리자를 사용하여 이를 수행하는 방법을 설명합니다.
이벤트 및 대리자 사용
백그라운드 스레드에서 UI를 업데이트하려면 이벤트와 대리자를 사용할 수 있습니다. 특정 이벤트가 발생하면 이벤트가 발생하므로 구독자가 응답으로 미리 정의된 코드를 실행할 수 있습니다. 대리자는 별도의 스레드에서 호출할 수 있는 메서드를 나타냅니다.
이벤트 기반 접근 방식
이 접근 방식에서는 UI가 필요할 때 백그라운드 스레드가 이벤트를 발생시킵니다. 업데이트되었습니다. 메인 스레드는 이 이벤트를 구독하고 적절한 UI 업데이트 코드를 실행합니다. 예는 다음과 같습니다.
class MainWindow : Window { private void startCalc() { // ... CalcClass calc = new CalcClass(); calc.ProgressUpdate += (s, e) => { Dispatcher.Invoke((Action)delegate() { /* Update UI */ }); }; Thread calcthread = new Thread(new ParameterizedThreadStart(calc.testMethod)); calcthread.Start(input); } } class CalcClass { public event EventHandler ProgressUpdate; public void testMethod(object input) { // ... if (ProgressUpdate != null) ProgressUpdate(this, new YourEventArgs(status)); // ... } }
작업 기반 접근 방식(C# 4.5 이상)
또 다른 옵션은 비동기 작업을 나타내는 작업을 사용하는 것입니다. 태스크는 Task.Run 메서드를 사용하여 생성할 수 있으며 별도의 스레드에서 코드를 실행하는 깔끔한 방법을 제공합니다.
class MainWindow : Window { Task calcTask = null; void buttonStartCalc_Clicked(object sender, EventArgs e) { StartCalc(); } async void buttonDoCalc_Clicked(object sender, EventArgs e) { await CalcAsync(); } void StartCalc() { var calc = PrepareCalc(); calcTask = Task.Run(() => calc.TestMethod(input)); } Task CalcAsync() { var calc = PrepareCalc(); return Task.Run(() => calc.TestMethod(input)); } // ... } class CalcClass { public event EventHandler<EventArgs<YourStatus>> ProgressUpdate; public TestMethod(InputValues input) { // ... ProgressUpdate.Raise(this, status); // ... } }
결론
두 이벤트- 기반 및 작업 기반 접근 방식을 사용하여 백그라운드 스레드에서 UI를 업데이트할 수 있습니다. 이벤트 기반 접근 방식은 더 간단하지만 작업 기반 접근 방식은 더 나은 제어 및 오류 처리 기능을 제공합니다. 특정 요구 사항에 가장 적합한 접근 방식을 선택하세요.
위 내용은 다른 클래스의 백그라운드 스레드에서 UI를 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!