2011-12-04 2 views
9

특정 시나리오가 없지만 DispatcherTimer를 통해 Timer를 사용할 수있는 시나리오를 생각할 때이 질문이 마음에 들었습니다.타이머 대 DispatcherTimer 성능

  1. 사용 A : 내가 타이머 이벤트가 발생을하고 UI에 작은 수정을 할 때마다 연산 집약적 인 작업 올 수행해야하는 시나리오에서

    , 그것은 성능면에서 더 좋을 것이다 일반 타이머를 누른 다음 응용 프로그램의 디스패처를 사용하여 UI를 변경하십시오.
  2. DispatcherTimer를 사용하십시오 (필요하다면 일부 비동기 백그라운드 작업자에서 내 계산으로 집중 작업을 수행 할 수도 있음).

가능한 한 오랫동안 UI 스레드를 차단 해제하면 사용자 환경이 향상됩니다. 이 인 경우 이러한 시나리오에서 제가 알아야 할 걸림쇠가 있습니까?

편집 :

나는 느낌이 내 질문에 충분히 밝혀지지 않았다 얻을, 그래서 만들어 낸 예이기는하지만, 시도하고 콘크리트를 추가하는거야.

2 분마다 큰 파일을 읽어야하고, 끝나면 ListBox에 항목을 추가해야한다고 가정 해 봅니다. 파일을 읽거나 처리하는 데 UI 작업을하지 않는 동안 10-15 초가 걸린다고 가정 해 보겠습니다. 이런 식으로 최선의 접근 방법은 무엇입니까?

답변

2

좀 더 조사하고 분석 한 결과, 정기적 인 타이머가 만들어진 예에서 가장 잘 작동한다는 결론에 도달했습니다. 지금까지는 코드에서 잠재적 인 문제를 일으킬 수있는 특정 사항을 찾아야 만했습니다. 그렇게 말하면서 좋은 코딩 방법은 결코 해를 끼치 지 않습니다!

1
  • 는 타이머

  • DispatcherTimer은 지정된 시간 간격 및 지정된 우선 순위로 처리된다 디스패처 큐에 통합되는 타이머 애플리케이션에서 반복 이벤트를 생성한다.

타이머는 시간 간격이 발생할 때 정확하게 실행되는 것은 보장되지 않지만 시간 간격이 지나기 전에 실행되지 않도록 보장됩니다. 이는 DispatcherTimer 조작이 다른 조작처럼 Dispatcher 대기열에 위!하기 때.입니다. DispatcherTimer 조작이 실행되면 대기열에있는 다른 작업과 우선 순위에 따라 달라집니다.

타이머가 WPF application에서 사용되는 경우, Timer runs on a different thread then the user interface (UI) thread입니다. 사용자 인터페이스 (UI) 스레드의 오브젝트에 액세스하려면 Invoke 또는 BeginInvoke를 사용하여 사용자 인터페이스 (UI) 스레드의 Dispatcher에 작업을 게시해야합니다. Timer와 반대되는 DispatcherTimer를 사용하는 이유는 DispatcherTimer가 Dispatcher와 동일한 스레드에서 실행되고 DispatcherPriority가 설정 될 수 있기 때문입니다.

+1

어쩌면 내 질문을 명확히해야하지만 타이머가 별도의 스레드에서 실행되며 Dispatcher가이 경우 UI를 터치해야한다는 것을 이미 알고 있습니다. 나는 UI를 터치해야 할 때조차도 WPF 애플리케이션에서 Timer를 사용할 가치가 있을지 궁금했다. –

0

UI 요소에 바인딩 된 스칼라 (콜렉션이 아닌) 값을 변경하려는 경우 UI 스레드 (예 : 타이머 위임자)에서뿐만 아니라 변경할 수 있습니다. 이 경우 Dispatcher.Invoke/BeginInvoke를 사용할 필요가 없습니다.

0

또 다른 옵션은 각 타이머 반복마다 BackgroundWorker 클래스 인스턴스를 만드는 DispatcherTimer를 사용하는 것입니다. 또한 많은 경우 Dispatcher.Invoke/BeginInvoke를 사용하지 않아도됩니다.

+0

나는 나의 선택을 알고있다. :). * 이상적인 * 옵션이 무엇인지에 대한 통찰력을 찾고 있습니다. –

5

홈페이지 포인트 :

이는 DispatcherTimer를 사용 하지을 나타냅니다

연산 집약적 인 작업을 올 수행 할 수 있습니다. 주로 주 스레드에서 작은 작업을 수행하고 다른 스레드를 만드는 것을 피하기 위해 존재합니다.

DispatcherTimer를 사용하여 Backgroundworker를 시작하면 주 목적을 우회합니다.

여기 일반 타이머 만 사용하십시오.

+0

일반 타이머를 사용할 때주의해야 할 사항이 있습니까? 나는 어딘가에 UI 요소를 잠글 필요가 있을지 모른다고 생각하지만 이것이 필요한지 확실하지는 않습니다. –

+1

예, GUI를 업데이트 할 때 Dispatcher.Invoke()가 필요합니다. 평소처럼. –

1

Comparing Timer with DispatcherTimer일부 답변은 귀하의 질문에 더 구체적이지만,이 링크는 몇 가지 일반적인 정보와 조언을 제공한다고 생각합니다.