|
|
@@ -4,6 +4,7 @@ using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Diagnostics;
|
|
|
using System.Reactive.Concurrency;
|
|
|
+using System.Reactive.Disposables;
|
|
|
using System.Threading;
|
|
|
using Microsoft.Reactive.Testing;
|
|
|
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
|
|
@@ -184,7 +185,6 @@ namespace ReactiveTests.Tests
|
|
|
results.AssertEqual(0, 1, 2);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
[TestMethod]
|
|
|
public void EventLoop_ScheduleTimeAndOrderedInFlightActions()
|
|
|
{
|
|
|
@@ -381,5 +381,45 @@ namespace ReactiveTests.Tests
|
|
|
EventLoop.NoSemaphoreFullException();
|
|
|
}
|
|
|
#endif
|
|
|
+
|
|
|
+#if !NO_CDS && DESKTOPCLR
|
|
|
+ [TestMethod]
|
|
|
+ public void EventLoop_CorrectWorkStealing()
|
|
|
+ {
|
|
|
+ const int workItemCount = 100;
|
|
|
+
|
|
|
+ var failureCount = 0;
|
|
|
+ var countdown = new CountdownEvent(workItemCount);
|
|
|
+ var dueTime = DateTimeOffset.Now + TimeSpan.FromSeconds(1);
|
|
|
+
|
|
|
+ using (var d = new CompositeDisposable())
|
|
|
+ {
|
|
|
+ for (var i = 0; i < workItemCount; i++)
|
|
|
+ {
|
|
|
+ var scheduler = new EventLoopScheduler();
|
|
|
+
|
|
|
+ scheduler.Schedule(() =>
|
|
|
+ {
|
|
|
+ var schedulerThread = Thread.CurrentThread;
|
|
|
+
|
|
|
+ scheduler.Schedule(dueTime, () =>
|
|
|
+ {
|
|
|
+ if (Thread.CurrentThread != schedulerThread)
|
|
|
+ {
|
|
|
+ Interlocked.Increment(ref failureCount);
|
|
|
+ }
|
|
|
+ countdown.Signal();
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ d.Add(scheduler);
|
|
|
+ }
|
|
|
+
|
|
|
+ countdown.Wait();
|
|
|
+ }
|
|
|
+
|
|
|
+ Assert.AreEqual(0, failureCount);
|
|
|
+ }
|
|
|
+#endif
|
|
|
}
|
|
|
}
|