public static void TestObjectDisposedException() { ThreadWorker worker = new ThreadWorker(new ProgressContext()); worker.Work += (object sender, ThreadWorkerEventArgs e) => { e.Result = FileOperationStatus.Success; }; try { worker.Run(); worker.Join(); } finally { worker.Dispose(); } bool hasCompleted = false; Assert.Throws<ObjectDisposedException>(() => { worker.Run(); }); Assert.Throws<ObjectDisposedException>(() => { worker.Join(); }); Assert.Throws<ObjectDisposedException>(() => { hasCompleted = worker.HasCompleted; }); Assert.That(!hasCompleted, "Although the thread has completed, the variable should still be false since the attempt to set it is after Dispose()."); Assert.DoesNotThrow(() => { worker.Dispose(); }); }