Dispatcher.beginInvoke导致内存泄漏

时间:2016-12-06 11:01:43

标签: c# wpf

    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);
        }
    }

对于后台工作者,我想每隔一秒向主网格添加一个矩形。我必须使用this.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 个答案:

答案 0 :(得分:3)

此代码

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

为调度员排队无限量的工作。 BeginInvoke将不会等待act调用完成,它只会将其放入某个内部列表并返回。基本上永远这样做会占用所有可用的内存。

请注意,这不是内存泄漏。它按预期工作,你只是过度使用它。