2
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(...)for all WaitHandles。

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

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

在 WPF 3.5 上运行。

谢谢

4

1 回答 1

2

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

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

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

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

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

于 2012-05-29T10:13:04.607 回答