> 백엔드 개발 > C++ > 다른 클래스의 별도 스레드에서 WPF UI를 안전하게 업데이트하는 방법은 무엇입니까?

다른 클래스의 별도 스레드에서 WPF UI를 안전하게 업데이트하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-05 18:25:41
원래의
792명이 탐색했습니다.

How to Safely Update a WPF UI from a Separate Thread in a Different Class?

별도 클래스의 다른 스레드에서 UI 업데이트

별도 클래스를 실행하는 스레드에서 WPF UI를 업데이트할 때 발생하는 일반적인 문제 . 계산 시간이 길어지면 UI가 멈추고 사용자에게 진행 상황을 알려주어야 합니다.

스레드와 이벤트를 사용한 솔루션

  1. Dispatcher. 호출: 다른 스레드에서 UI를 업데이트하려면 Dispatcher.Invoke를 사용하세요. 별도의 클래스에서 호출하려면 이벤트를 사용하세요.
  2. 이벤트 등록: 메인 클래스에서 계산 클래스에 의해 발생되는 이벤트를 등록하세요.
  3. 이벤트 알림: 계산 클래스에서 업데이트가 있을 때 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
    }
}
로그인 후 복사

추가 참고:

  • 효율적인 처리를 보장합니다. 경쟁 조건이나 잠재적인 교착 상태를 방지하기 위해 이벤트를 진행합니다.
  • 별도 스레드에서 UI 업데이트가 성능에 미치는 영향을 고려하세요.

위 내용은 다른 클래스의 별도 스레드에서 WPF UI를 안전하게 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿