我在另一个线程中创建窗口。关闭线程后,某些资源窗口不会从内存中释放。由于Windows任务管理器中增加了计数器GDI对象和用户对象。没有发布的图形是字体和区域。我没有想法是怎么回事...在另一个线程中创建窗口后WPF内存泄漏
public class WaitingWindowManager
{
private Thread thread;
private bool canAbortThread = false;
private Window waitingWindow;
public void BeginWaiting()
{
this.thread = new Thread(this.RunThread);
this.thread.IsBackground = true;
this.thread.SetApartmentState(ApartmentState.STA);
this.thread.Start();
}
public void EndWaiting()
{
if (this.waitingWindow != null)
{
this.waitingWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => { this.waitingWindow.Close(); }));
while (!this.canAbortThread) { };
}
this.thread.Abort();
}
public void RunThread()
{
this.waitingWindow = new Window();
this.waitingWindow.Closed += new EventHandler(waitingWindow_Closed);
this.waitingWindow.ShowDialog();
}
void waitingWindow_Closed(object sender, EventArgs e)
{
this.canAbortThread = true;
}
}
而且拨打:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
WaitingWindowManager waitingWindowManager = new WaitingWindowManager();
waitingWindowManager.BeginWaiting();
Application.Current.Dispatcher.Thread.Join(5000);
waitingWindowManager.EndWaiting();
}
}
不起作用。在这种情况下,我也有泄漏记忆。 public void RunThread() Window waitingWindow = new Window(); // waitingWindow.Closed + = new EventHandler(waitingWindow_Closed); waitingWindow.ShowDialog(); } – LuckyDan 2010-10-30 19:32:45
我所做的是这样的。我使用了Femaref的建议并删除了处理程序。我确实允许新窗口被丢弃。 void waitingWindow_Closed(object sender,EventArgs e) { this.waitingWindow.Closed - = new EventHandler(waitingWindow_Closed); Dispatcher.CurrentDispatcher.InvokeShutdown(); this.canAbortThread = true; }如果这仍在泄漏什么物体正在泄漏 – 2010-10-30 20:12:07
我无法理解。假设事件处理程序阻止我们处理对象。 如果我添加 空隙waitingWindow_Closed(对象发件人,EventArgs的) { \t this.waitingWindow.Closed - =新的EventHandler(waitingWindow_Closed); \t this.canAbortThread = true; } 它必须解决问题。但这不起作用。 此外,如果你没有一般的处理程序,结果是相同的:内存泄漏 – LuckyDan 2010-10-30 20:29:22