wpf 타이머 동작중 정지되는 문제

  • 무엇을 하고자 하는지

두개의 프로젝트를 이용하여 (A, B)
A의 wpf 창에 B에서 생성한 데이터를 출력하고자 합니다.

  • 현재 작성한 코드 중 문제가 되는 부분

B프로젝트에서 thread와 timer를 이용하여
10ms마다 데이터를 생성합니다.
그리고 A프로젝트에서 그 값을 받아 WPF화면에 출력하는 코드인데

잘 진행되다가 한번씩 멈추는 현상이 발생하네요

WPF UI가 있는 프로젝트(A프로젝트)는 문제가 없는것으로 보입니다.
B프로젝트의 timer에 10ms주기 콘솔 출력을 추가해본 결과 콘솔 출력이 멈춤니다.


timer는 10ms라는 시간 때문에 multimediaTimer를 사용하였습니다.
(system.timer.timer는 10ms 주기가 잘 안맞더군요)

  • 기대하는 동작
  1. A 프로젝트에 데이터값 정상 출력
    (해당 클래스를 4가지로 선언해서 사용 예정)

  2. B프로젝트에 있는 timer의 정지 현상 해결

  3. 추가적으로 5ms주기를 보장할 수 있는 타이머가 있으면 추천 부탁드립니다.

**프로젝트파일 링크

1개의 좋아요

Task.Delay 는 어때요 ?

2개의 좋아요

답변 감사합니다.

Task.Delay를 사용하란 말이
While로 루프를 돌리고
Task Delay로 딜레이를 주는 방법을 말씀하시는건가요?

      var t = Task.Run(async delegate
              {
                 await Task.Delay(10);
                 return 42;
              });

While(true)
{
      t.Wait();
      Console.WriteLine("Task t Status: {0}, Result: {1}",
                        t.Status, t.Result);
}

위와 같은 구조인가요?
제가 실력이 부족해서 맞는지 모르겠네요.

1개의 좋아요

네 맞습니다.
컨트롤 처리는 Invoke 로 하시면 될듯요

2개의 좋아요

WPF UI가 있는 프로젝트에 문제가 있는 것이 맞습니다. 잘 살펴 보시면 분명히 문제를 발견할 수 있을 것입니다. ^^

4개의 좋아요

제가 찾은건

BeginInvoke 대신Invoke를 사용하니 이상 없이 잘 돌아가고 있습니다.

말씀하신 포인트가 맞나요?

BeginInvoke는 비동기
Invoke는 동기식인데

이게 큰 문제가 되는건가요?

제가 이해하기론 외부 스레드에서 UI스레드의 컨트롤을 편집하는 상황에서 사용하는데
두가지 선택에 따라 다른 결과가 나오네요.

제가 나름 구글링과 MSDN을 검색 해본 결과 이 상황에서 왜 문제가 되는지 명확한 문제점을 아직 못찾았네요.

혹시 더 공부해볼 키워드를 아신다면 알려주세요 :smiley:

2개의 좋아요

그거랑 상관없습니다. 아마도 Invoke로 바꾸면서 코드 몇 개를 더 날리셔서 그로 인한 부작용으로 해결된 듯합니다.

어떤 특수한 문제가 아니고, 기본적인 지식에 속하는 문제라… 다시 한번 잘 살펴보시기 바랍니다

참고로, 재현 코드를 올려 주신 것은 아주 좋은 ^^ 자세입니다. 이번 경우에는 조각 코드 정도로만 올리고 질문했다면 답변하실 수 있는 분들이 (저를 포함해) 없었을 것입니다.

5개의 좋아요

답변해주신 모든 분들 감사합니다 ^0^

2개의 좋아요