public static void TestObjectDisposedException() { IThreadWorker worker = Resolve.Portable.ThreadWorker(nameof(TestObjectDisposedException), new ProgressContext(), false); worker.WorkAsync = (ThreadWorkerEventArgs e) => { e.Result = new FileOperationContext(String.Empty, ErrorStatus.Success); return(Task.FromResult <object>(null)); }; try { worker.Run(); worker.Join(); } finally { worker.Dispose(); } bool hasCompleted = false; Assert.Throws <ObjectDisposedException>(() => { worker.Run(); }); Assert.DoesNotThrow(() => { worker.Join(); }); Assert.DoesNotThrow(() => { hasCompleted = worker.HasCompleted; }); Assert.That(hasCompleted, "Even though the thread has completed, the variable should be set, since we allow calls to HasCompleted even after Dispose()."); Assert.DoesNotThrow(() => { worker.Dispose(); }); }
static void Main(string[] args) { ISingleConsumerQueue <TextFileContext> consumerQueue = new MonitorSingleConsumerQueue <TextFileContext>(new TextFileConsumer(FileName)); IThreadWorker producerThread = new TextFileContextProducer(consumerQueue); IThreadWorker consumerThread = consumerQueue; try { consumerThread.Start(); producerThread.Start(); Console.WriteLine($"({Thread.CurrentThread.Name}): Модель запущена. Данные пишутся в {Path.Combine(Directory.GetCurrentDirectory(), FileName)}"); Console.WriteLine($"({Thread.CurrentThread.Name}): Нажмите любую клавишу, чтобы остановить модель."); Console.ReadKey(true); Console.WriteLine($"({Thread.CurrentThread.Name}): Остановка модели..."); } finally { producerThread.Dispose(); consumerThread.Dispose(); producerThread.Join(); consumerThread.Join(); Console.WriteLine($"({Thread.CurrentThread.Name}): Модель остановлена. Нажмите любую клавишу для выхода..."); Console.ReadKey(true); } }
public void Dispose() { _worker.Dispose(); }