public void ErrorOnWorkerTest() { int sleepMilliSeconds = 3 * 1000; int count = 0; var worker = new SingleTaskWorker("Test"); var mock = new Mock <ILogger>(); ILogger logger = mock.Object; Action workError = () => { throw new Exception(); }; // タスクを開始する。 var result = worker.StartTask(logger, workError); Thread.Sleep(500); // work内で例外が投げられても、ログ処理がされるだけでそれ以上は何もしない。 // エラー後も正常に動作する Action work = () => { count++; Thread.Sleep(sleepMilliSeconds); count++; }; result = worker.StartTask(logger, work); Thread.Sleep(500); Assert.AreEqual(Result.Started, result); Assert.AreEqual(1, count); }
public void RunningCountDoesNotExceedOne() { int sleepMilliSeconds = 3 * 1000; int count = 0; var worker = new SingleTaskWorker("Test"); var mock = new Mock <ILogger>(); ILogger logger = mock.Object; Action work = () => { count++; Thread.Sleep(sleepMilliSeconds); count++; }; // 非同期でがーっと投げて問題ないことを確認 var tasks = new List <Task>(); var results = new ConcurrentQueue <Result>(); for (int i = 0; i < 50; i++) { tasks.Add(Task.Run(() => { results.Enqueue(worker.StartTask(logger, work, count)); Assert.AreEqual(1, worker.RunningCount); })); } // Workerを叩き終わるのを待つ。 // Workerが実行する非同期処理は待たない点に注意。 Task t = Task.WhenAll(tasks); t.Wait(); Assert.IsFalse(t.IsFaulted); Assert.AreEqual(1, results.Count((x) => x == Result.Started)); Assert.AreEqual(49, results.Count((x) => x == Result.AlreadyRunning)); // Workerが実行する非同期処理の完了するのを待つ Thread.Sleep(sleepMilliSeconds * 2); Assert.AreEqual(0, worker.RunningCount); // 再度実行できるはず。 var result = worker.StartTask(logger, work, count); Assert.AreEqual(Result.Started, result); Assert.AreEqual(3, count); Assert.AreEqual(1, worker.RunningCount); }