ConcurrencyTest.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
  2. using System;
  3. using System.Reactive.Concurrency;
  4. using System.Threading;
  5. using Microsoft.VisualStudio.TestTools.UnitTesting;
  6. namespace ReactiveTests.Tests
  7. {
  8. [TestClass]
  9. public class ConcurrencyTest
  10. {
  11. [TestMethod]
  12. public void CurrentScheduler_EnsureTrampoline()
  13. {
  14. const int concurrency = 100;
  15. var passed = true;
  16. var s = new Semaphore(0, int.MaxValue);
  17. var e = new ManualResetEvent(false);
  18. for (var i = 0; i < concurrency; ++i)
  19. NewThreadScheduler.Default.Schedule(() =>
  20. {
  21. e.WaitOne();
  22. try
  23. {
  24. if (Scheduler.CurrentThread.ScheduleRequired)
  25. Scheduler.CurrentThread.Schedule(() => { });
  26. else
  27. new Action(() => { })();
  28. }
  29. catch (NullReferenceException)
  30. {
  31. passed = false;
  32. }
  33. finally
  34. {
  35. s.Release();
  36. }
  37. });
  38. e.Set();
  39. for (var i = 0; i < concurrency; ++i)
  40. s.WaitOne();
  41. Assert.IsTrue(passed);
  42. }
  43. [TestMethod]
  44. public void CurrentScheduler_Schedule()
  45. {
  46. const int concurrency = 100;
  47. var passed = true;
  48. var s = new Semaphore(0, int.MaxValue);
  49. var e = new ManualResetEvent(false);
  50. for (var i = 0; i < concurrency; ++i)
  51. NewThreadScheduler.Default.Schedule(() =>
  52. {
  53. e.WaitOne();
  54. try
  55. {
  56. if (Scheduler.CurrentThread.ScheduleRequired)
  57. Scheduler.CurrentThread.Schedule(() => { });
  58. else
  59. new Action(() => { })();
  60. }
  61. catch (NullReferenceException)
  62. {
  63. passed = false;
  64. }
  65. finally
  66. {
  67. s.Release();
  68. }
  69. });
  70. e.Set();
  71. for (var i = 0; i < concurrency; ++i)
  72. s.WaitOne();
  73. Assert.IsTrue(passed);
  74. }
  75. }
  76. }