2014-09-29 3 views
0

UI 스레드 아래에 MainWindow가있는 WPF 응용 프로그램이 있습니다. 다른 창을 만드는 스레드를 만들었습니다. 계속 업데이트해야하기 때문에 스레드에서이 창을 만들어야합니다. 나는이 윈도우의 소유자가 MainWindow가되기를 바란다. 그래서 Dispatcher.Invoke를 사용하여이 윈도우의 소유자를 설정합니다.크로스 스레딩 오류/응답 없음 UI

Dispatcher.Invoke를 사용하여 스레드 2에서 Main UI Thread에 액세스 할 때 크로스 스레드 액세스 예외가 발생합니다.

곧 샘플 코드를 게시하겠습니다. 그 때까지는 누군가 아이디어가 있다면 공유하십시오.

이것은 내가 위에서 언급 한 접근 방식 구현 생각되는 내 실제 문제 : 내가 사용하고있는 중이 야 100 밀리 초 간격으로 업데이트되는 창에서 4 라인 시리즈 세 라인 차트 각이

을 Dispatcher.Invoke. 이 때문에 UI가 느려지고 응답하지 않는 경우가 있습니다.

+2

윈도우를 지속적으로 업데이트해야하는 필요성이 'MainWindow'와 같은 스레드에서 윈도우를 만드는 것과 모순되지 않는다는 것을 알고 계십니까? 귀하의 회신에 감사드립니다. –

답변

3

다른 창을 만드는 스레드를 만들었습니다.

이미 좋은 생각이 아니며 많은 문제가 발생하기 쉽습니다. 응용 프로그램의 모든 창은 기본 "GUI"스레드에 의해 작성되어야합니다.

이 창을 지속적으로 업데이트해야하기 때문에 스레드를 만들어야합니다.

다른 스레드에서 창을 만들지 않고도이를 수행 할 수있는 방법이 있습니다. 주 스레드에서 창을 만든 다음 백그라운드 스레드를 사용하여이를 업데이트하십시오. 해당 백그라운드 스레드는 Dispatcher.Invoke을 사용하여 새 창을 업데이트 할 수 있습니다.

+0

당신이 주어진 것은 내가 현재 구현 한 것입니다. 나는'Dispatcher.Invoke'를 사용하여 100ms 간격으로 업데이트되는 세 줄의 챠트를 그 윈도우에 가지고 있습니다. 이 때문에 UI가 느리게 반응하지 않는 경우가 종종 발생합니다. – Abhishek

+3

일반적으로 다른 스레드에서 UI 스레드에 액세스하는 것은 좋지 않습니다.하지만 가능하지만 좋지 않습니다. 스레드에서 100ms 작업을 수행하고 데이터 구조 만 업데이트하면됩니다. 그런 다음 예를 들어 1000ms마다 UI를 업데이트 할 준비가 된 데이터로 업데이트하십시오. – user743414

+2

@Abhishek "user743414"가 옳습니다. 100ms마다 차트를 업데이트하는 것은 의미가 없습니다. 자주 필요한 데이터를 업데이트하고 주기적으로 UI를 업데이트하십시오. – vcsjones

관련 문제