2013-05-02 3 views
2
  1. 두 개의 UI 스레드가 있습니다. 하나는 주 스레드이고 다른 하나는 ApartmentState가 STA 인 백그라운드 스레드입니다. 각 스레드는 자체 창을 만들고 배경 창에는 "취소"단추가 있습니다.WPF의 다중 스레드 UI

  2. 주 스레드는 사용량이 많고 완료하는 데 오랜 시간이 걸리는 기능이 있습니다. 일단 "취소"버튼을 클릭하면 주 스레드가 시간 소모적 인 기능을 중단해야합니다. (...) {

    //Option A: Application.DoEvents(); 
        //Option B: Dispatcher.Invoke to update UI in background thread 
        if(cancel)  
        return; //Stop the time-consuming function 
        else  
        DoSomething; 
    

    }

에 대한

이상한 것은 클릭 이벤트이다 : 아래

  • 는 메인 스레드의 의사 코드 "취소"버튼은 백그라운드 스레드에 의해 캡처되거나 처리되지 않습니다. IMO, 각 스레드는 자체 메시지 대기열을 가지고 있으며 "취소"버튼을 클릭하면이 메시지를 대기열에 넣고 배경 스레드가 즉시 처리해야하지만 내 테스트 결과에 따라 로컬 스레드가 처리하지 못합니다 버튼 클릭 이벤트 ...

    의견이 있으십니까?

    둘째, 위의 문제를 해결하는 두 가지 방법이 있는데, 하나는 Application.DoEvents를 사용하고 다른 하나는 Dispatcher.Invoke를 이용하는 것입니다. 그러나 배경 스레드가 메시지를 즉시 처리 할 수없는 이유는 여전히 궁금합니다. 미리 감사드립니다.

  • +2

    WPF에'Application.DoEvents'가 없습니다 ... 어떻게 구현 했습니까? –

    +0

    않습니다. 이벤트. lawd. – Will

    답변

    3

    일반적으로 두 개의 사용자 인터페이스 스레드가있는 것은 종종 나쁜 아이디어이며 완전히 불필요합니다.

    일반적으로 단일 사용자 인터페이스 스레드가 있으며 실제 컴퓨터 작업을 백그라운드 스레드로 옮길 수 있습니다. 사용자 인터페이스 업데이트는 필요에 따라 주 스레드로 마샬링됩니다. 이 경우 많은 경우에 BackgroundWorker이 좋습니다.

    취소의 경우 일반적으로 CancellationTokenSourceCancellationToken 주위에 구축 된 cooperative cancelation model 프레임 워크를 사용하여 처리하는 것이 가장 좋습니다. 이들은 여러 스레드를 염두에두고 사용하도록 설계되었으며 필요한 적절한 메모리 장벽을 자동으로 처리합니다.

    +0

    감사 리드. 그렇습니다. 두 개의 UI 스레드가있는 것이 좋지 않다고 생각합니다.하지만 Button Click 이벤트를 백그라운드 스레드가 처리 할 수없는 이유와 Application.DoEvents가 작동하는 이유는 무엇입니까? – buaaji

    +0

    @buaaji 당신이 호출 할 때 당신은 아마 잘못된 발송자를 사용하고 있습니다 ... –