WorkerTest.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. namespace MeloongCore.Tests;
  2. public class WorkerTest : TestBase {
  3. [Test]
  4. public async Task Run_在工作线程执行工作负载() {
  5. int callerThreadId = Thread.CurrentThread.ManagedThreadId;
  6. int workloadThreadId = callerThreadId;
  7. using var started = new ManualResetEventSlim(false);
  8. var worker = new RedoableWorker(() => {
  9. workloadThreadId = Thread.CurrentThread.ManagedThreadId;
  10. started.Set();
  11. });
  12. worker.Start();
  13. await Assert.That(started.Wait(3000)).IsTrue();
  14. await Assert.That(worker.WaitIfRunning(3000)).IsTrue();
  15. await Assert.That(workloadThreadId != callerThreadId).IsTrue();
  16. await Assert.That(worker.LastSucceeded).IsTrue();
  17. }
  18. [Test]
  19. public async Task Run_运行中再次调用只重跑一次() {
  20. int callerThreadId = Thread.CurrentThread.ManagedThreadId;
  21. int runCount = 0;
  22. var workloadThreadIds = new ConcurrentQueue<int>();
  23. using var firstStarted = new ManualResetEventSlim(false);
  24. var worker = new RedoableWorker(ct => {
  25. int currentRun = Interlocked.Increment(ref runCount);
  26. workloadThreadIds.Enqueue(Thread.CurrentThread.ManagedThreadId);
  27. if (currentRun == 1) {
  28. firstStarted.Set();
  29. while (true) {
  30. ct?.ThrowIfCancellationRequested();
  31. Thread.Sleep(10);
  32. }
  33. }
  34. });
  35. worker.Start();
  36. await Assert.That(firstStarted.Wait(3000)).IsTrue();
  37. worker.Start();
  38. worker.Start();
  39. await Assert.That(worker.WaitIfRunning(3000)).IsTrue();
  40. await Assert.That(runCount).IsEqualTo(2);
  41. await Assert.That(workloadThreadIds.All(id => id != callerThreadId)).IsTrue();
  42. await Assert.That(worker.LastSucceeded).IsTrue();
  43. }
  44. }