스레드의 로컬 서버에서 많은 변수를 읽는 벤치 마크 도구를 프로그래밍하고 있습니다.UI 요소 호출시 스레드가 느리게 실행 됨
int countReads = 1000;
Int64 count = 0;
for (int i = 0; i < countReads; i++)
{
Thread.CurrentThread.Priority = ThreadPriority.Highest;
DateTime start = DateTime.Now;
session.Read(null, 0, TimestampsToReturn.Neither, idCollection, out ReadResults, out diagnosticInfos);
DateTime stop = DateTime.Now;
Thread.CurrentThread.Priority = ThreadPriority.Normal;
TimeSpan delay = (stop - start);
double s = delay.TotalMilliseconds;
count += (Int64)s;
Dispatcher.Invoke(DispatcherPriority.Render, new Action(() =>
{
progressBar1.Value = i;
}));
}
double avg = (double)count/countReads;
Dispatcher.Invoke(DispatcherPriority.Input, new Action(() =>
{
listBox1.Items.Add(avg);
}));
나는 읽기를 계속하고 마지막 평균 소요 시간을 얻는 데 걸리는 시간을 계산합니다.
DateTime start = DateTime.Now;
session.Read(null, 0, TimestampsToReturn.Neither, idCollection, out ReadResults, out diagnosticInfos);
DateTime stop = DateTime.Now
진행률 막대를 업데이트하지 않고 코드를 실행하면 약 5ms 평균이 소요됩니다. 하지만 실행하면
Dispatcher.Invoke(DispatcherPriority.Render, new Action(() =>
{
progressBar1.Value = i;
}));
평균 약 10ms가 걸립니다.
내 질문은 왜 진행률 막대를 사용할 때 시간 간격이 더 높습니까? 나는 읽기 시간을 계산 중입니다. 진행 표시 줄 업데이트를 포함하지 않습니다.
내 읽기 시간 간격에 영향을 미치지 않도록 ui- 그림을 대피시킬 방법이 있습니까?
도움 주셔서 감사합니다.
안부 현재 실행중인 스레드가 사용하는 디스패처에 연결되어있는 경우
간단한 컨텍스트 스위치, 속성 세트 및 일부 페인트 메시지 발행시 추가 5ms는 오랜 시간이 걸립니다. GUI 메시지 큐가 사용 중입니까? 어쨌든 BeginInvoke를 사용해보십시오. 그렇다면 기다릴 필요가 없습니다. –
DateTime.Now 대신 Stopwatch를 사용하십시오. –
BeginInvoke는 동일한 동작입니다. Thread.sleep (20)을 사용하여 읽기 요청을 바꾸면 timespan은 거의 정확히 20ms이기 때문에 궁금합니다. 진행 바를 사용하거나 사용하지 않고. 그러나 읽기 요청에 대해 더 긴 시간 간격을 갖지 않고 UI를 업데이트 할 수있는 방법이 있습니까? – Destructor