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上运行。
由于
答案 0 :(得分:2)
ManualResetEvent实现IDisposable,因此您需要在完成后处置它们。在这种情况下,当Method1完成时,将它们全部清除......将以下内容添加到方法的末尾
void Method1(object sender, DoWorkEventArgs e)
{
...
foreach(ManualResetEvent mre in list2)
mre.Dispose();
}
这应该允许正确释放ManualResetEvent正在使用的非托管资源。
您需要检查其他方法,以确保其中的任何IDisposable项也被释放。您的示例中可能存在的罪魁祸首是ConvertList1ToPDF和RenderImages。