C# Backgroundworker内存泄漏和;使用;陈述

C# Backgroundworker内存泄漏和;使用;陈述,c#,memory-leaks,backgroundworker,C#,Memory Leaks,Backgroundworker,我们有一个程序(表单),它在许多情况下使用许多backgroundworker线程(我们不能重用它们) 我们注意到程序的内存在不断增长,并使用内存分析器对此进行分析。我注意到有许多backgroundworker对象 我认为如果我使用“using”语句,就可以完成处理对象的任务,但它似乎不起作用 using (BackgroundWorker bgwConnectClient = new BackgroundWorker()) { bgwConnectClient.DoWork += n

我们有一个程序(表单),它在许多情况下使用许多backgroundworker线程(我们不能重用它们)

我们注意到程序的内存在不断增长,并使用内存分析器对此进行分析。我注意到有许多backgroundworker对象

我认为如果我使用“using”语句,就可以完成处理对象的任务,但它似乎不起作用

using (BackgroundWorker bgwConnectClient = new BackgroundWorker())
{
    bgwConnectClient.DoWork += new DoWorkEventHandler(bgwConnectClient_DoWork);
    bgwConnectClient.RunWorkerAsync();
}

有什么想法吗???

因为对象被挂接到事件,所以内存泄漏。你需要修改你的代码

BackgroundWorker bgwConnectClient = new BackgroundWorker();
bgwConnectClient.DoWork += new DoWorkEventHandler(bgwConnectClient_DoWork);
bgwConnectClient.RunWorkerAsync();
完成工作后,不再需要BGW连接

这样做

bgwConnectClient.DoWork -= new DoWorkEventHandler(bgwConnectClient_DoWork);

解除处理程序的锁定,这样垃圾收集器就可以清理了……但是在它完成工作之前,你不能处理它!所以使用“using”语句是没有用的。。。只是为了确保-正确的方法是解除处理程序(可能在bgwConnectClient_-DoWork内部)的连接,然后调用Dispose(也在bgwConnectClient_-DoWork中)??还是应该在OnComplete中?是的,这里使用“using”语句是没有用的。当你觉得你不再需要这个活动的时候。取消链接并处置您的工作人员。如果未取消链接就进行了dispose,则事件dispose将不会处理worker.private void按钮1\u单击(对象发送方,事件参数e){var bgw=new BackgroundWorker();bgw.DoWork+=bgw\u DoWork;bgw.RunWorkerCompleted+=bgw\u RunWorkerCompleted;bgw.RunWorkerAsync();}void bgw\u RunWorkerCompleted(对象发送方,runworkercompletedeventarges){BackgroundWorker bgw=作为BackgroundWorker的发送者;bgw.DoWork-=bgw_-DoWork;bgw.RunWorkerCompleted-=bgw_-RunWorkerCompleted;bgw.Dispose();}void bgw_-DoWork(对象发送者,doworkereventarge){//something}我添加了以下代码:void bgw_-RunWorkerCompleted(对象发送者,runworkercompletedeventarge){BackgroundWorker bgw=作为BackgroundWorker的发件人;bgw.DoWork-=bgw_DoWork;bgw.RunWorkerCompleted-=bgw_RunWorkerCompleted;bgw.Dispose();}当我运行它时,内存一直在增长,好像backgroundworker没有被真正处理一样……那么处理backgroundworker的最佳方法是什么呢?我真的需要这里的帮助……问题是我们使用backgroundworker,它应该用于UI,而不是用于基本线程。一旦我们使用Task()一切都很好,没有记忆问题