왜 사용 문을 싸지 않으십니까? 별로 별도의 노력과 당신은 처분을받을 :
private void PerformLongRunningOperation()
{
using (BackgroundWorker worker = new BackgroundWorker())
{
worker.DoWork += delegate
{
// perform long running operation here
};
worker.RunWorkerAsync();
}
}
편집 :
using System;
using System.ComponentModel;
using System.Threading;
namespace BackgroundWorkerTest
{
internal class Program
{
private static BackgroundWorker _privateWorker;
private static void Main()
{
PrintThread("Main");
_privateWorker = new BackgroundWorker();
_privateWorker.DoWork += WorkerDoWork;
_privateWorker.RunWorkerCompleted += WorkerRunWorkerCompleted;
_privateWorker.Disposed += WorkerDisposed;
_privateWorker.RunWorkerAsync();
_privateWorker.Dispose();
_privateWorker = null;
using (var BW = new BackgroundWorker())
{
BW.DoWork += delegate
{
Thread.Sleep(2000);
PrintThread("Using Worker Working");
};
BW.Disposed += delegate { PrintThread("Using Worker Disposed"); };
BW.RunWorkerCompleted += delegate { PrintThread("Using Worker Completed"); };
BW.RunWorkerAsync();
}
Console.ReadLine();
}
private static void WorkerDisposed(object sender, EventArgs e)
{
PrintThread("Private Worker Disposed");
}
private static void WorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
PrintThread("Private Worker Completed");
}
private static void WorkerDoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(2000);
PrintThread("Private Worker Working");
}
private static void PrintThread(string caller)
{
Console.WriteLine("{0} Thread: {1}", caller, Thread.CurrentThread.ManagedThreadId);
}
}
}
: 내가 좀 처리하고 이것 저것에 무슨 일이 일어나고 있는지보고 함께 약간의 테스트를 넣어
확인 출력은 다음과 같습니다.
Main Thread: 1
Private Worker Disposed Thread: 1
Using Worker Disposed Thread: 1
Private Worker Working Thread: 3
Using Worker Working Thread: 4
Using Worker Completed Thread: 4
Private Worker Completed Thread: 3
일부 테스트에서 Dispose()는 기본적으로 영향을 미치지 않습니다. 개시 한 BackgroundWorker. using 문 범위 내에서 호출하는지 또는 코드에서 선언 된 코드를 사용하여 즉시 처리하고 참조를 취소하더라도 여전히 정상적으로 실행됩니다. Disposed Event는 주 스레드에서 발생하고 DoWork 및 RunWorkerCompleted는 스레드 풀 스레드에서 발생합니다 (이벤트 발생시 사용할 수있는 스레드 중 하나). Dispose (DoWork가 완료되기 전에)를 호출하고 RunWorkerCompleted가 실행되지 않은 직후에 RunWorkerCompleted 이벤트의 등록을 취소 한 경우를 시도했습니다. 이것은 내가 처분 함에도 불구하고 여전히 BackgroundWorker 객체를 조작 할 수 있다고 믿게합니다.
다른 사람들이 언급했듯이 현재는 Dispose를 호출하는 것이 꼭 필요한 것은 아닌 것처럼 보입니다. 그러나, 나는 적어도 내 경험과 이러한 테스트를 통해서도 해를 입지는 않습니다.
_why_는 bgw.Dispose()를 호출해야합니까? 게다가 거기에는 보통 논리가 있기 때문에 논리가 있습니다. –
@Henk. 추가 세부 정보를 추가했습니다. 100 % 중요하지는 않지만, 호출되도록 설계되었습니다. 그것을 호출하고 싶지 않으면 다른 Winforms 코드에 더 적합한 다른 클래스가 있습니다. –