void worker_DoWork(object sender, DoWorkEventArgs e)
{
Action act = (Action)(() =>
{
Thread.Sleep(1000);
RRect r = new RRect(rnd.Next(100, 100), rnd.Next(100, 100), GetMousePosition(), PickBrush(), 1080);
this.mainGrid.Children.Add(r);
});
while (true)
{
this.Dispatcher.BeginInvoke(act, DispatcherPriority.Input);
}
}
배경 작업자와 함께, 1 초마다 주 그리드에 사각형을 추가하고 싶습니다. 자물쇠를 피하기 때문에 this.Dispatcher.BeginInvoke를 사용해야합니다. 내 질문은Dispatcher.beginInvoke는 메모리 누수를 야기합니다.
this.Dispatcher.BeginInvoke(act, DispatcherPriority.Input);
코드 블록이 원인이 큰 메모리를 유출한다는 것입니다. 그게 뭐가 잘못 됐어?
편집 1 :
나는
Thread.Sleep(1000);
RRect r = new RRect(rnd.Next(100, 100), rnd.Next(100, 100), GetMousePosition(), PickBrush(), 1080);
this.mainGrid.Children.Add(r);
아무것도 변경되지 않습니다 삭제합니다.
어떤 방식으로 메모리 누수가 발생합니까? 메모리 사용량이 올라가는 것을 볼 수는 있지만 그리드에 메모리에 남아 있어야하는 아이템을 더 추가하고 있기 때문에 정상입니다. 액세스가 가능하기 때문입니다. – Kenneth
@Kenneth 위 코드 블록을 삭제하면 아무런 변화가 없습니다. 어떻게 작동하는지 알 수 있습니다. – FreeMan
'while (true) {anything}'은 좋지 않습니다. 호출 될 때까지 기다리시겠습니까? 'Invoke'를 사용하십시오. 'BeginInvoke'는 매우 빨리 queue = OOM을 채울 것입니다. – Sinatr