2016-12-06 1 views
-1
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); 

아무것도 변경되지 않습니다 삭제합니다.

+1

어떤 방식으로 메모리 누수가 발생합니까? 메모리 사용량이 올라가는 것을 볼 수는 있지만 그리드에 메모리에 남아 있어야하는 아이템을 더 추가하고 있기 때문에 정상입니다. 액세스가 가능하기 때문입니다. – Kenneth

+0

@Kenneth 위 코드 블록을 삭제하면 아무런 변화가 없습니다. 어떻게 작동하는지 알 수 있습니다. – FreeMan

+0

'while (true) {anything}'은 좋지 않습니다. 호출 될 때까지 기다리시겠습니까? 'Invoke'를 사용하십시오. 'BeginInvoke'는 매우 빨리 queue = OOM을 채울 것입니다. – Sinatr

답변

2

이 코드 발송자가 수행하는 대한

while (true) 
{ 
    this.Dispatcher.BeginInvoke(act, DispatcherPriority.Input); 
} 

큐 작업의 무한한 양을. BeginInvokeact 호출이 완료 될 때까지 기다리지 않고 일부 내부 목록에 넣고 반환합니다. 이것을 기본으로 은 사용 가능한 메모리를 모두 소모합니다.

메모리 누수가 아닙니다. 그것은 의도 한대로 작동하고 있으며, 지나치게 많이 사용하고 있습니다.

+0

설명해 주셔서 감사합니다. – FreeMan

관련 문제