线程保持在内存中

时间:2012-05-29 08:53:00

标签: c# wpf

void Method1(object sender, DoWorkEventArgs e)
{
    var list1 = (List<some objects>)e.Argument;
    var list2 = new List<WaitHandle>();

    foreach (var thing in list1)
    {
        var ws = new ManualResetEvent(false);
        list2.Add(ws);
        dispatcher.BeginInvoke(DispatcherPriority.Background,
            new RunDelegate(Method2), thing, ws);
    }

    WaitHandle.WaitAll(list2.ToArray());

    ConvertList1ToPDF(list1);
}

// ------------------------------------------------------------------

void Method2(Thing thing, ManualResetEvent handle)
{
    var class = thing;
    Class.RenderImages();
    PDFCount++; 
    UpdateStatusMessage("Do something " + PDFCount + " of " +
        NumberofPfdToCreate.Count() + " compounds");

    handle.Set();
}

我遇到多个不释放内存的线程的问题。我正在从数据对象创建PDF图表。

安排是我遍历数据对象。对于每个数据对象,我创建一个ManualResetEvent并将其添加到list2。然后我使用BeginInvoke启动一个调度程序,并将ManualResetEvent对象作为参数传递。

然后我为所有WaitHandle.WaitAll(...)提供WaitHandle

问题是内存没有被释放。它只是积累,直到最终我得到一个“内存不足”的例外。

我不一定在寻找解决方案,只是看看是否有人知道问题可能是什么。

在WPF 3.5上运行。

由于

1 个答案:

答案 0 :(得分:2)

ManualResetEvent实现IDisposable,因此您需要在完成后处置它们。在这种情况下,当Method1完成时,将它们全部清除......将以下内容添加到方法的末尾

void Method1(object sender, DoWorkEventArgs e)
{
    ...

    foreach(ManualResetEvent mre in list2)
        mre.Dispose();   
}

这应该允许正确释放ManualResetEvent正在使用的非托管资源。

您需要检查其他方法,以确保其中的任何IDisposable项也被释放。您的示例中可能存在的罪魁祸首是ConvertList1ToPDF和RenderImages。