통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
WPF & Silverlight 포럼마을입니다.
  마을등급 WPF & Silverlight   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 서학수 주민 728 since 2008-07-17
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
[마을 게시판]
WPF 강좌
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 질문&답변 ※ 꼭 답변채택을 해주시어 성의껏 답변해주신 회원님께 감사의 마음을 전하시길 바랍니다.
 DispatcherTimer와 Task의 속도차이가 나는 이유!  | WPF 2018-11-22 오후 4:05:49
dytnf0128 번호: 2756 추천:0  / 읽음:424

이번에 처음으로 WPF를 사용해보는 초보 개발자 입니다

차트는 C1Chart 를 사용하고 있구요

2분정도의 범위를 가지고 시간이 지나면 시프트 되는 차트를 한 화면에서 네개 보여주고 있습니다

처음에는 Task를 사용해서 구현했는데 화면이 너무 버벅거리더라구요

그래서 DispatcherTimer로 바꿔봤더니 버벅거림없이 잘 돌아갑니당

근데 왜 이런 차이가 나는지 궁금해서요 

조언 부탁드려요!

아래는 제가 사용했던 Task, DispatcherTimer 코드 입니다!

 

Task

Task SetChartTask = new Task(new System.Action(SetChartData));
SetChartTask.Start();
 
        private void SetChartData()
        {
            while (MainWindow.IsRunning)
            {
                try
                {
                    Update(Chargingchart, chargeseries, Value, Time);
                    Update(PVchart, pvseries, Value, Time);
                    Update(SOCchart, socseries, Value, Time);
                    Update(SOHchart, sohseries, Value, Time);
 
                    Thread.Sleep(10);
                }
                catch (Exception ee) { LogFactory.Log(ee); }
            }
        }
 
        void Update(C1Chart chart, XYDataSeries series, float value, DateTime time)
        {
            Dispatcher.Invoke(DispatcherPriority.Normal, new System.Action(delegate
            {
                chart.BeginUpdate();
                series.XValues.Add(time.ToOADate());
                series.Values.Add(value);
 
                if (DateTime.FromOADate(chart.View.AxisX.Max) < time)
                {
                    chart.View.AxisX.Min = DateTime.FromOADate(chart.View.AxisX.Min).Add(time - DateTime.FromOADate(chart.View.AxisX.Max)).ToOADate();
                    chart.View.AxisX.Max = time.ToOADate();
                }
                if (DateTime.FromOADate(series.XValues.First()) <= DateTime.FromOADate(chart.View.AxisX.Min))
                {
                    series.XValues.RemoveAt(0);
                    series.Values.RemoveAt(0);
                }
 
                chart.EndUpdate();
            }));
        }

-----

DispatcherTimer

 

DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 1);
timer.Tick += SetChartData;
timer.Start();
 
        private void SetChartData(object sender, EventArgs e)
        {
                try
                {
                    Update(Chargingchart, chargeseries, Value, Time);
                    Update(PVchart, pvseries, Value, Time);
                    Update(SOCchart, socseries, Value, Time);
                    Update(SOHchart, sohseries, Value, Time);
 
                    Thread.Sleep(10);
                }
                catch (Exception ee) { LogFactory.Log(ee); }
        }
 
        void Update(C1Chart chart, XYDataSeries series, float value, DateTime time)
        {
                chart.BeginUpdate();
                series.XValues.Add(time.ToOADate());
                series.Values.Add(value);
 
                if (DateTime.FromOADate(chart.View.AxisX.Max) < time)
                {
                    chart.View.AxisX.Min = DateTime.FromOADate(chart.View.AxisX.Min).Add(time - DateTime.FromOADate(chart.View.AxisX.Max)).ToOADate();
                    chart.View.AxisX.Max = time.ToOADate();
                }
                if (DateTime.FromOADate(series.XValues.First()) <= DateTime.FromOADate(chart.View.AxisX.Min))
                {
                    series.XValues.RemoveAt(0);
                    series.Values.RemoveAt(0);
                }
 
                chart.EndUpdate();
        }

-----

DispatcherTimer를 사용했냐 Task를 사용했냐를 제외하면 다른 부분은 노란색으로 표시된 부분 뿐입니다 

왜 속도차이가 발생하는 걸까요?

DispatcherTimer나 Task의 문제가 아니라 코드상에 문제가 있는걸까요?

이 글에 답변 등록하기
 [답변]....... 2018-11-26 오후 4:58:04
 psycobra  psycobra님께 메시지 보내기psycobra님을 내 주소록에 추가합니다.psycobra님의 개인게시판 가기 번호: 2757 추천:0  

일단 주기가 틀리네요.

 

Task는 Sleep으로 10ms 간격이고, DispatcherTimer는 1000 ms (1초)인데,

 

당연히 Timer는 1초에 한번 돌때 Task는 대략 100 회 정도 수행하니, Task가 느리죠.

 

비슷하게 테스트 하려면 DispatcherTimer 인터벌 부분을 아래 처럼 고치고 해보세요.

 

Timer.Interval = TimeSpan.FromMilliseconds(10);

이 글에 답변 등록하기
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.