Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Why not wrap in a using statement? Not much extra effort and you get the disposal:</p> <pre><code>private void PerformLongRunningOperation() { using (BackgroundWorker worker = new BackgroundWorker()) { worker.DoWork += delegate { // perform long running operation here }; worker.RunWorkerAsync(); } } </code></pre> <p>EDIT:</p> <p>Ok, I put together a little test to kinda see what is going on with disposal and whatnot:</p> <pre><code>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); } } } </code></pre> <p>Here is the output:</p> <pre><code>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 </code></pre> <p>From some testing, it appears that Dispose() has basically no effect on an initiated BackgroundWorker. Whether or not you call it in the scope of a using statement, or use it declared in code and immediately dispose it and dereference it, it still runs normally. The Disposed Event occurs on the main thread, and the DoWork and RunWorkerCompleted occur on thread pool threads (whichever one is available when the event fires). I tried a case where I unregistered the RunWorkerCompleted event right after I called Dispose (so before DoWork had a chance to complete) and RunWorkerCompleted did not fire. This leads me to believe that you can still manipulate the BackgroundWorker object despite it being disposed. </p> <p>So as others have mentioned, at this time, it does appear as though calling Dispose is not really required. However, I do not see any harm in doing it either, at least from my experience and these tests. </p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload