//데이터의 전체 또는 일부 수신시 호출
client.DownloadProgressChanged += (obj, ev) =>
{
watch.Stop();//스탑워치 정지
lock(locksum)
{
if (watch.ElapsedMilliseconds == 0) goto end; //시간간격이 지나치게 짧은경우 평균 산정에서 아예 제외
else if (avgsam.Count < 5) avgsam.Add(new Tuple<double, long>(watch.ElapsedMilliseconds, ev.BytesReceived)); //소요시간 & 현재 이벤트 호출시 받은 바이트양
else
{
double t = 0; //소요시간합
double s = 0; //바이트합
avgsam.ForEach(x =>
{
t += x.Item1;
s += x.Item2;
});
t /= 1000; //밀리초->초
s /= t; //현재까지 받은 바이트 / 현재까지 소요된 초
s /= 1024;//바이트->킬로바이트
avgsam.Clear();
string speed = s.ToString("N2") + "킬로바이트";
TaskManager.ControlInvoke(label2, () => label2.Text = string.Format("평균 전송속도:{0}", speed));
}
}
end:
watch.Restart(); //스탑워치 재시작
};
실제 속도보다 훨씬 빠르게 나오는 느낌인데.
코드 버그의 문제라기보다는 메소드 한군데서 두가지 일을 한꺼번에 하면서 문제가 있는지 없는지조차 검증하기 어렵게 짠게 문제...
어차피 C#으로 짤거면 로직을 두개로 나누고 두 개의 스레드를 돌리겠음... 양쪽이 공유하는 큐를 하나 마련하고(물론 동기화큐) 한놈은 큐에 통계에 쓰일 데이터를 밀어넣고 다른 한놈은 1초마다 깨어나서 큐에서 데이터를 끄집어내서 속도를 갱신하도록...
이렇게 하면 내가 큐에 가상의 데이터를 넣고 실제 예상대로 결과가 나오는지 확인할 수가 있음. 분할정복인데, 분할할때 검증 가능한 작은 크기로 쪼개는게 중요...