좋아, C#/.NET을 배웠고 지금까지 winforms를 고수했지만 WPF는이 프로젝트에 적합하다고 보였다.System.Timers.Timer가 반복 될 때마다 썩음
나는 이미지 배열을 표시하는 WrapPanel이 있습니다. 때로는이 배열이 창 경계를 초과하게 만듭니다. 모든 이미지가 타이머를 사용하여 표시 될 때까지 "페이지"를 순환하려고합니다.
public void t2_Elapsed(object source, ElapsedEventArgs e)
{
wrapPanel1.Dispatcher.BeginInvoke((ThreadStart)delegate
{
remaining = Convert.ToInt32(imgCount) - (iteration*xDensity);
label1.Content = iteration;
label2.Content = remaining;
label3.Content = imgCount;
if (remaining <= 1)
{
Thickness marginTop = wrapPanel1.Margin;
marginTop.Top = 0;
wrapPanel1.Margin = marginTop;
wrapPanel1.Children.Clear();
t2.Stop();
imgLayout();
}
else
{
Thickness marginTop = wrapPanel1.Margin;
marginTop.Top = -((prevResY+10) * iteration);
wrapPanel1.Margin = marginTop;
iteration++;
}
});
}
imgCount가 나타내는 더블 : 오버 플로우가있는 경우
내 WrapPanel (wrapPanel1)가 이미 채워 된이 시점에서 타이머 경과 이벤트에서 내 코드 샘플을 시작하고 확인합니다 WrapPanel의 총 이미지 수 (코드 내의 다른 위치와의 상호 작용으로 인해 두 배가되어야 함)
xDensity는 가로로 표시되는 이미지의 수를 설정하는 사용자 정의 정수입니다.
prevResY는 각 사진의 높이 (모두 같은 해상도)입니다. WrapPanel이 채워질 때마다 설정되는 5 픽셀 여백을 고려하여 10을 추가합니다. 반복을 곱함으로써 wrapPanel1을 항상 1 행 위로 이동시킵니다.
imgLayout(); 모든 페이지를 실행할 때마다 새 이미지가 있는지 확인하고 끝에서 오래된 이미지를 노크 할 때마다 프로세스가 다시 시작됩니다. 이것은 imgLayout()에서 모두 처리됩니다.
디버깅 중에 레이블을 업데이트하여 예상 한 값을 정확하게 반환합니다.
질문 제목에서 수집 한 것처럼 내 문제는 내 t2_elapsed를 반복 할 때마다 간격이 늘어나는 것입니다. 동작을 관찰하기 위해 간격을 10ms로 설정하면 지연이 기하 급수적으로 증가하는 것처럼 보입니다. 30 초 후 지연은 약 25 초이며, 처음에는 0.1에서 증가했다. RAM 사용량이 천천히 올라가서 루프가 다시 시작될 때 일부 리소스가 삭제되지 않고 그 원인인지 또는 별도의 문제인지 확실하지 않습니다.
누군가 도움을 줄 수 있기를 바랍니다. 내가 바보 같은 짓을했다면, 나에게 아직도 말해, 나 아직도 배우고있어!
확인
많은 감사
---- 업데이트 ---- 나는 그것이wrapPanel1.Children.Clear();
라인을 함께 할 수있는 뭔가 생각 때문에. 나는 그것을 제거하고 그것을 채우도록하고 지연시키지 않는다. 그러나 이것은 분명히 최종 해결책이 아니다. 그 줄을 어디에두면 문제가 재현됩니다. 2 ----
---- UPDATE 그럼 지금은 오히려 바보 같은 느낌. 이전 타이머가 내가 사용하던 시작되는 imgLayout() 방법 :
t2.Interval = new TimeSpan(0, 0, 0, 0, 5000);
t2.Tick += new EventHandler(t2_Tick);
t2.Start();
내가 바보 이벤트 핸들러에게 루프를 다시 시작할 때마다 선언했다. 대신 Window_Loaded 메서드에서 설정하고 현재 예상대로 정확하게 작동하고 그냥 약간 정돈하고 한 번에 하나의 전체 페이지를 한 번에 한 페이지 씩 스크롤하는 방법을 구현했습니다.
얼마나 많은 이미지를 표시합니까? 합리적인 시간 내에 그들을 정리/처분 할 수없는 것 같습니다. – Tudor
테스트 목적으로 분당 9 개의 이미지 폴더가 있으며 한 번에 4 개씩 표시하도록 설정되어 있습니다. 현실 세계 시나리오에서는 주어진 시간에 약 60 개까지 처리해야 할 수 있습니다. – Rich