瀏覽代碼

Add NO_THREAD feature checks

Oren Novotny 9 年之前
父節點
當前提交
ab361e0034
共有 21 個文件被更改,包括 152 次插入104 次删除
  1. 2 0
      Rx.NET/Source/Tests.System.Reactive/DispatcherHelpers.cs
  2. 2 2
      Rx.NET/Source/Tests.System.Reactive/TestLongRunningScheduler.cs
  3. 4 1
      Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/CurrentThreadSchedulerTest.cs
  4. 2 2
      Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/DefaultSchedulerTest.cs
  5. 4 0
      Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs
  6. 3 2
      Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/ImmediateSchedulerTest.cs
  7. 4 1
      Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/NewThreadSchedulerTest.cs
  8. 5 2
      Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/SynchronizationContextSchedulerTest.cs
  9. 4 0
      Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/TaskPoolSchedulerTest.cs
  10. 3 2
      Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/VirtualSchedulerTest.cs
  11. 44 40
      Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableBlockingTest.cs
  12. 4 1
      Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableConcurrencyTest.cs
  13. 5 4
      Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableEventsTest.cs
  14. 3 1
      Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableImperativeTest.cs
  15. 15 12
      Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableTimeTest.cs
  16. 1 0
      Rx.NET/Source/Tests.System.Reactive/Tests/Linq/QbservableTest.cs
  17. 7 2
      Rx.NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/AsyncSubjectTest.cs
  18. 3 1
      Rx.NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/SubjectTest.cs
  19. 2 0
      Rx.NET/Source/Tests.System.Reactive/Tests/ObserverTest.cs
  20. 4 0
      Rx.NET/Source/Tests.System.Reactive/Tests/RegressionTest.cs
  21. 31 31
      Rx.NET/Source/Tests.System.Reactive/project.json

+ 2 - 0
Rx.NET/Source/Tests.System.Reactive/DispatcherHelpers.cs

@@ -9,6 +9,7 @@ using System.Windows.Threading;
 
 namespace ReactiveTests
 {
+#if !NO_DISPATCHER
     static class DispatcherHelpers
     {
         public static DispatcherWrapper EnsureDispatcher()
@@ -68,4 +69,5 @@ namespace ReactiveTests
             _dispatcher.BeginInvoke(action);
         }
     }
+#endif
 }

+ 2 - 2
Rx.NET/Source/Tests.System.Reactive/TestLongRunningScheduler.cs

@@ -44,7 +44,7 @@ namespace ReactiveTests
         {
             throw new NotImplementedException();
         }
-
+#if !NO_THREAD
         public IDisposable ScheduleLongRunning<TState>(TState state, Action<TState, ICancelable> action)
         {
             var d = new BooleanDisposable();
@@ -77,7 +77,7 @@ namespace ReactiveTests
 
             return d;
         }
-
+#endif
         object IServiceProvider.GetService(Type serviceType)
         {
             if (serviceType == typeof(ISchedulerLongRunning))

+ 4 - 1
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/CurrentThreadSchedulerTest.cs

@@ -27,6 +27,7 @@ namespace ReactiveTests.Tests
             Assert.True(res.Seconds < 1);
         }
 
+#if !NO_THREAD
         [Fact]
         public void CurrentThread_ScheduleAction()
         {
@@ -35,6 +36,7 @@ namespace ReactiveTests.Tests
             Scheduler.CurrentThread.Schedule(() => { Assert.Equal(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
             Assert.True(ran);
         }
+#endif
 
         [Fact]
         public void CurrentThread_ScheduleActionError()
@@ -51,7 +53,7 @@ namespace ReactiveTests.Tests
                 Assert.Same(e, ex);
             }
         }
-
+#if !NO_THREAD
         [Fact]
         public void CurrentThread_ScheduleActionNested()
         {
@@ -110,6 +112,7 @@ namespace ReactiveTests.Tests
             Assert.True(ran, "ran");
             Assert.True(sw.ElapsedMilliseconds > 380, "due " + sw.ElapsedMilliseconds);
         }
+#endif
 #endif
         [Fact]
         public void CurrentThread_EnsureTrampoline()

+ 2 - 2
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/DefaultSchedulerTest.cs

@@ -28,7 +28,7 @@ namespace ReactiveTests.Tests
             var res = DefaultScheduler.Instance.Now - DateTime.Now;
             Assert.True(res.Seconds < 1);
         }
-
+#if !NO_THREAD
         [Fact]
         public void ScheduleAction()
         {
@@ -91,7 +91,7 @@ namespace ReactiveTests.Tests
 
             Assert.False(fail);
         }
-
+#endif
 #if DESKTOPCLR
         [Fact]
         public void No_ThreadPool_Starvation_Dispose()

+ 4 - 0
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/EventLoopSchedulerTest.cs

@@ -22,7 +22,9 @@ namespace ReactiveTests.Tests
         {
             var el = new EventLoopScheduler();
 
+#if !NO_THREAD
             ReactiveAssert.Throws<ArgumentNullException>(() => new EventLoopScheduler(null));
+#endif
             ReactiveAssert.Throws<ArgumentNullException>(() => el.Schedule<int>(42, default(Func<IScheduler, int, IDisposable>)));
             ReactiveAssert.Throws<ArgumentNullException>(() => el.Schedule<int>(42, DateTimeOffset.Now, default(Func<IScheduler, int, IDisposable>)));
             ReactiveAssert.Throws<ArgumentNullException>(() => el.Schedule<int>(42, TimeSpan.Zero, default(Func<IScheduler, int, IDisposable>)));
@@ -49,6 +51,7 @@ namespace ReactiveTests.Tests
             Assert.True(ran);
         }
 
+#if !NO_THREAD
         [Fact]
         public void EventLoop_DifferentThread()
         {
@@ -63,6 +66,7 @@ namespace ReactiveTests.Tests
             Assert.True(gate.WaitOne(TimeSpan.FromSeconds(2)));
             Assert.NotEqual(Thread.CurrentThread.ManagedThreadId, id);
         }
+#endif
 
         [Fact]
         public void EventLoop_ScheduleOrderedActions()

+ 3 - 2
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/ImmediateSchedulerTest.cs

@@ -19,7 +19,7 @@ namespace ReactiveTests.Tests
             var res = Scheduler.Immediate.Now - DateTime.Now;
             Assert.True(res.Seconds < 1);
         }
-
+#if !NO_THREAD
         [Fact]
         public void Immediate_ScheduleAction()
         {
@@ -28,6 +28,7 @@ namespace ReactiveTests.Tests
             Scheduler.Immediate.Schedule(() => { Assert.Equal(id, Thread.CurrentThread.ManagedThreadId); ran = true; });
             Assert.True(ran);
         }
+#endif
 
         [Fact]
         public void Immediate_ScheduleActionError()
@@ -141,7 +142,7 @@ namespace ReactiveTests.Tests
             });
         }
 
-#if !SILVERLIGHT
+#if !SILVERLIGHT && !NO_THREAD
         [Fact]
         [Ignore]
         public void Immediate_ScheduleActionDue()

+ 4 - 1
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/NewThreadSchedulerTest.cs

@@ -31,7 +31,7 @@ namespace ReactiveTests.Tests
             var res = NewThreadScheduler.Default.Now - DateTime.Now;
             Assert.True(res.Seconds < 1);
         }
-
+#if !NO_THREAD
         [Fact]
         public void NewThread_ScheduleAction()
         {
@@ -56,6 +56,7 @@ namespace ReactiveTests.Tests
             Assert.True(sw.ElapsedMilliseconds > 180, "due " + sw.ElapsedMilliseconds);
         }
 #endif
+#endif
 
 #if !NO_PERF
 #if !NO_STOPWATCH
@@ -85,6 +86,7 @@ namespace ReactiveTests.Tests
             d.Dispose();
         }
 
+#if !NO_THREAD
         [Fact]
         public void NewThread_Periodic_NonReentrant()
         {
@@ -113,5 +115,6 @@ namespace ReactiveTests.Tests
 
             Assert.False(fail);
         }
+#endif
     }
 }

+ 5 - 2
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/SynchronizationContextSchedulerTest.cs

@@ -96,8 +96,7 @@ namespace ReactiveTests.Tests
         }
 
 #if !SILVERLIGHT
-        [Fact]
-        [Ignore]
+        [Fact(Skip ="Ignored")]        
         public void SynchronizationContext_ScheduleActionDue()
         {
             var ms = new MySync();
@@ -171,6 +170,7 @@ namespace ReactiveTests.Tests
             Assert.True(ran);
         }
 
+#if !NO_THREAD
         [Fact]
         public void SynchronizationContext_DontPost_Same()
         {
@@ -194,6 +194,7 @@ namespace ReactiveTests.Tests
             Assert.True(count == 0 /* no post */);
             Assert.True(ran);
         }
+#endif
 
         [Fact]
         public void SynchronizationContext_AlwaysPost_Different()
@@ -207,6 +208,7 @@ namespace ReactiveTests.Tests
             Assert.True(ran);
         }
 
+#if !NO_THREAD
         [Fact]
         public void SynchronizationContext_AlwaysPost_Same()
         {
@@ -230,5 +232,6 @@ namespace ReactiveTests.Tests
             Assert.True(count == 1 /* post */);
             Assert.True(ran);
         }
+#endif
     }
 }

+ 4 - 0
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/TaskPoolSchedulerTest.cs

@@ -30,6 +30,7 @@ namespace ReactiveTests.Tests
             Assert.True(res.Seconds < 1);
         }
 
+#if !NO_THREAD
         [Fact]
         public void TaskPool_ScheduleAction()
         {
@@ -103,6 +104,7 @@ namespace ReactiveTests.Tests
             Assert.True(n >= 0);
         }
 #endif
+#endif
 
 #if !NO_PERF
 #if !NO_STOPWATCH
@@ -132,6 +134,7 @@ namespace ReactiveTests.Tests
             d.Dispose();
         }
 
+#if !NO_THREAD
         [Fact]
         public void TaskPool_Periodic_NonReentrant()
         {
@@ -160,6 +163,7 @@ namespace ReactiveTests.Tests
 
             Assert.False(fail);
         }
+#endif
 
         [Fact]
         public void TaskPool_Delay_LargerThanIntMaxValue()

+ 3 - 2
Rx.NET/Source/Tests.System.Reactive/Tests/Concurrency/VirtualSchedulerTest.cs

@@ -47,7 +47,7 @@ namespace ReactiveTests.Tests
             var res = new VirtualSchedulerTestScheduler().Now - DateTime.Now;
             Assert.True(res.Seconds < 1);
         }
-
+#if !NO_THREAD
         [Fact]
         public void Virtual_ScheduleAction()
         {
@@ -58,6 +58,7 @@ namespace ReactiveTests.Tests
             scheduler.Start();
             Assert.True(ran);
         }
+#endif
 
         [Fact]
         public void Virtual_ScheduleActionError()
@@ -108,7 +109,7 @@ namespace ReactiveTests.Tests
             ReactiveAssert.Throws<ArgumentNullException>(() => new HistoricalScheduler().ScheduleRelative(42, TimeSpan.FromSeconds(1), default(Func<IScheduler, int, IDisposable>)));
         }
 
-#if !SILVERLIGHT
+#if !SILVERLIGHT && !NO_THREAD
         [Fact]
         [Ignore]
         public void Virtual_ScheduleActionDue()

+ 44 - 40
Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableBlockingTest.cs

@@ -592,6 +592,7 @@ namespace ReactiveTests.Tests
             Assert.Equal(value, Observable.Range(value, 10).FirstOrDefault());
         }
 
+#if !NO_THREAD
         [Fact]
         public void FirstOrDefault_NoDoubleSet()
         {
@@ -624,6 +625,7 @@ namespace ReactiveTests.Tests
 
             o.Done();
         }
+#endif
 
         class O : IObservable<int>
         {
@@ -653,9 +655,9 @@ namespace ReactiveTests.Tests
             }
         }
 
-        #endregion
+#endregion
 
-        #region + ForEach +
+#region + ForEach +
 
         [Fact]
         public void ForEach_ArgumentChecking()
@@ -761,9 +763,9 @@ namespace ReactiveTests.Tests
             ReactiveAssert.Throws(ex, () => xs.ForEach((x, i) => { throw ex; }));
         }
 
-        #endregion
+#endregion
 
-        #region + GetEnumerator +
+#region + GetEnumerator +
 
         [Fact]
         public void GetEnumerator_ArgumentChecking()
@@ -926,9 +928,9 @@ namespace ReactiveTests.Tests
         }
 #endif
 
-        #endregion
+#endregion
 
-        #region Last
+#region Last
 
         [Fact]
         public void Last_ArgumentChecking()
@@ -981,9 +983,9 @@ namespace ReactiveTests.Tests
             Assert.Equal(50, Observable.Range(value, 10).Last(i => i % 2 == 0));
         }
 
-        #endregion
+#endregion
 
-        #region LastOrDefault
+#region LastOrDefault
 
         [Fact]
         public void LastOrDefault_ArgumentChecking()
@@ -1036,9 +1038,9 @@ namespace ReactiveTests.Tests
             Assert.Equal(50, Observable.Range(value, 10).LastOrDefault(i => i % 2 == 0));
         }
 
-        #endregion
+#endregion
 
-        #region + Latest +
+#region + Latest +
 
         [Fact]
         public void Latest_ArgumentChecking()
@@ -1053,7 +1055,7 @@ namespace ReactiveTests.Tests
             var evt = new AutoResetEvent(false);
             var src = Observable.Create<int>(obs =>
             {
-                new Thread(() =>
+                Task.Run(() =>
                 {
                     evt.WaitOne();
                     obs.OnNext(1);
@@ -1061,18 +1063,18 @@ namespace ReactiveTests.Tests
                     obs.OnNext(2);
                     evt.WaitOne();
                     obs.OnCompleted();
-                }).Start();
+                });
 
                 return () => { disposed = true; };
             });
 
             var res = src.Latest().GetEnumerator();
 
-            new Thread(() =>
+            Task.Run(async () =>
             {
-                Thread.Sleep(250);
+                await Task.Delay(250);
                 evt.Set();
-            }).Start();
+            });
 
             Assert.True(res.MoveNext());
             Assert.Equal(1, res.Current);
@@ -1168,7 +1170,7 @@ namespace ReactiveTests.Tests
             var evt = new AutoResetEvent(false);
             var src = Observable.Create<int>(obs =>
             {
-                new Thread(() =>
+                Task.Run(() =>
                 {
                     evt.WaitOne();
                     obs.OnNext(1);
@@ -1181,11 +1183,11 @@ namespace ReactiveTests.Tests
 
             var res = src.Latest().GetEnumerator();
 
-            new Thread(() =>
+            Task.Run(async () =>
             {
-                Thread.Sleep(250);
+                await Task.Delay(250);
                 evt.Set();
-            }).Start();
+            });
 
             Assert.True(res.MoveNext());
             Assert.Equal(1, res.Current);
@@ -1195,9 +1197,9 @@ namespace ReactiveTests.Tests
             ReactiveAssert.Throws(ex, () => res.MoveNext());
         }
 
-        #endregion
+#endregion
 
-        #region + MostRecent +
+#region + MostRecent +
 
         [Fact]
         public void MostRecent_ArgumentChecking()
@@ -1212,7 +1214,7 @@ namespace ReactiveTests.Tests
             var nxt = new AutoResetEvent(false);
             var src = Observable.Create<int>(obs =>
             {
-                new Thread(() =>
+                Task.Run(() =>
                 {
                     evt.WaitOne();
                     obs.OnNext(1);
@@ -1223,7 +1225,7 @@ namespace ReactiveTests.Tests
                     evt.WaitOne();
                     obs.OnCompleted();
                     nxt.Set();
-                }).Start();
+                });
 
                 return () => { };
             });
@@ -1348,7 +1350,7 @@ namespace ReactiveTests.Tests
             var nxt = new AutoResetEvent(false);
             var src = Observable.Create<int>(obs =>
             {
-                new Thread(() =>
+                Task.Run(() =>
                 {
                     evt.WaitOne();
                     obs.OnNext(1);
@@ -1356,7 +1358,7 @@ namespace ReactiveTests.Tests
                     evt.WaitOne();
                     obs.OnError(ex);
                     nxt.Set();
-                }).Start();
+                });
 
                 return () => { };
             });
@@ -1381,9 +1383,9 @@ namespace ReactiveTests.Tests
             ReactiveAssert.Throws(ex, () => res.MoveNext());
         }
 
-        #endregion
+#endregion
 
-        #region + Next +
+#region + Next +
 
         [Fact]
         public void Next_ArgumentChecking()
@@ -1397,7 +1399,7 @@ namespace ReactiveTests.Tests
             var evt = new AutoResetEvent(false);
             var src = Observable.Create<int>(obs =>
             {
-                new Thread(() =>
+                Task.Run(() =>
                 {
                     evt.WaitOne();
                     obs.OnNext(1);
@@ -1405,18 +1407,18 @@ namespace ReactiveTests.Tests
                     obs.OnNext(2);
                     evt.WaitOne();
                     obs.OnCompleted();
-                }).Start();
+                });
 
                 return () => { };
             });
 
             var res = src.Next().GetEnumerator();
 
-            Action release = () => new Thread(() =>
+            Action release = () => Task.Run(async () =>
             {
-                Thread.Sleep(250);
+                await Task.Delay(250);
                 evt.Set();
-            }).Start();
+            });
 
             release();
             Assert.True(res.MoveNext());
@@ -1430,6 +1432,7 @@ namespace ReactiveTests.Tests
             Assert.False(res.MoveNext());
         }
 
+
         [Fact]
         public void Next2()
         {
@@ -1497,6 +1500,7 @@ namespace ReactiveTests.Tests
             Assert.True(res.Count == res.Distinct().Count());
         }
 
+#if !NO_THREAD
         [Fact]
         public void Next_Error()
         {
@@ -1532,10 +1536,10 @@ namespace ReactiveTests.Tests
 
             ReactiveAssert.Throws(ex, () => res.MoveNext());
         }
+#endif
+#endregion
 
-        #endregion
-
-        #region Single
+#region Single
 
         [Fact]
         public void Single_ArgumentChecking()
@@ -1595,9 +1599,9 @@ namespace ReactiveTests.Tests
             Assert.Equal(45, Observable.Range(value, 10).Single(i => i == 45));
         }
 
-        #endregion
+#endregion
 
-        #region SingleOrDefault
+#region SingleOrDefault
 
         [Fact]
         public void SingleOrDefault_ArgumentChecking()
@@ -1664,9 +1668,9 @@ namespace ReactiveTests.Tests
             Assert.Equal(0, Observable.Range(value, 10).SingleOrDefault(i => i > 100));
         }
 
-        #endregion
+#endregion
 
-        #region Wait
+#region Wait
 
         [Fact]
         public void Wait_ArgumentChecking()
@@ -1708,6 +1712,6 @@ namespace ReactiveTests.Tests
             Assert.Equal(n, res);
         }
 
-        #endregion
+#endregion
     }
 }

+ 4 - 1
Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableConcurrencyTest.cs

@@ -439,6 +439,7 @@ namespace ReactiveTests.Tests
             ReactiveAssert.Throws<ArgumentNullException>(() => Observable.Synchronize<int>(someObservable, null));
         }
 
+#if !NO_THREAD
         [Fact]
         public void Synchronize_Range()
         {
@@ -535,7 +536,7 @@ namespace ReactiveTests.Tests
 
             Assert.Equal(Enumerable.Range(0, 200).Sum(), sum);
         }
-
+#endif
 #endregion
     }
 
@@ -802,6 +803,7 @@ namespace ReactiveTests.Tests
             Assert.Same(ex_, err);
         }
 
+#if !NO_THREAD
         [Fact]
         public void ObserveOn_LongRunning_TimeVariance()
         {
@@ -831,6 +833,7 @@ namespace ReactiveTests.Tests
 
             end.WaitOne();
         }
+#endif
 
         [Fact]
         public void ObserveOn_LongRunning_HoldUpDuringDispatchAndFail()

+ 5 - 4
Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableEventsTest.cs

@@ -845,7 +845,7 @@ namespace ReactiveTests.Tests
             Assert.True(snd.SequenceEqual(new[] { 43, 44 }));
             Assert.True(thd.SequenceEqual(new[] { 44, 45 }));
         }
-
+#if !NO_THREAD
         [Fact]
         public void FromEvent_SynchronizationContext()
         {
@@ -942,6 +942,7 @@ namespace ReactiveTests.Tests
             t.Start();
             t.Join();
         }
+#endif
 
         [Fact]
         public void FromEvent_Scheduler1()
@@ -1184,9 +1185,9 @@ namespace ReactiveTests.Tests
         }
 
 
-        #endregion
+#endregion
 
-        #region <| Helpers |>
+#region <| Helpers |>
 
         class FromEventPattern_ArgCheck
         {
@@ -1355,6 +1356,6 @@ namespace ReactiveTests.Tests
             }
         }
 
-        #endregion
+#endregion
     }
 }

+ 3 - 1
Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableImperativeTest.cs

@@ -489,6 +489,7 @@ namespace ReactiveTests.Tests
             }
         }
 
+#if !NO_THREAD
         [Fact]
         public void ForEachAsync_DisposeThrows()
         {
@@ -541,6 +542,7 @@ namespace ReactiveTests.Tests
                 }
             }
         }
+#endif
 
         [Fact]
         public void ForEachAsync_SubscribeThrows()
@@ -570,7 +572,7 @@ namespace ReactiveTests.Tests
         }
 #endif
 
-        #endregion
+#endregion
 
         #region + Case +
 

+ 15 - 12
Rx.NET/Source/Tests.System.Reactive/Tests/Linq/ObservableTimeTest.cs

@@ -13,6 +13,7 @@ using System.Threading;
 using Microsoft.Reactive.Testing;
 using Xunit;
 using ReactiveTests.Dummies;
+using System.Threading.Tasks;
 
 namespace ReactiveTests.Tests
 {
@@ -892,13 +893,13 @@ namespace ReactiveTests.Tests
             var e = new ManualResetEvent(false);
             res.Subscribe(lst.Add, () => e.Set());
 
-            new Thread(() =>
+            Task.Run(() =>
             {
                 s.OnNext(1);
                 s.OnNext(2);
                 s.OnNext(3);
                 s.OnCompleted();
-            }).Start();
+            });
 
             e.WaitOne();
             Assert.True(new[] { 1, 2, 3 }.SequenceEqual(lst));
@@ -928,13 +929,13 @@ namespace ReactiveTests.Tests
             var err = default(Exception);
             res.Subscribe(_ => { }, ex_ => { err = ex_; e.Set(); });
 
-            new Thread(() =>
+            Task.Run(() =>
             {
                 s.OnNext(1);
                 s.OnNext(2);
                 s.OnNext(3);
                 s.OnError(ex);
-            }).Start();
+            });
 
             e.WaitOne();
             Assert.Same(ex, err);
@@ -965,13 +966,13 @@ namespace ReactiveTests.Tests
             var err = default(Exception);
             res.Subscribe(_ => { next.Set(); }, ex_ => { err = ex_; e.Set(); });
 
-            new Thread(() =>
+            Task.Run(() =>
             {
                 s.OnNext(1);
                 next.WaitOne();
 
                 s.OnError(ex);
-            }).Start();
+            });
 
             e.WaitOne();
             Assert.Same(ex, err);
@@ -1004,14 +1005,14 @@ namespace ReactiveTests.Tests
             var err = default(Exception);
             res.Subscribe(_ => { next.Set(); ack.WaitOne(); }, ex_ => { err = ex_; e.Set(); });
 
-            new Thread(() =>
+            Task.Run(() =>
             {
                 s.OnNext(1);
                 next.WaitOne();
 
                 s.OnError(ex);
                 ack.Set();
-            }).Start();
+            });
 
             e.WaitOne();
             Assert.Same(ex, err);
@@ -2191,12 +2192,12 @@ namespace ReactiveTests.Tests
             public IDisposable ScheduleLongRunning<TState>(TState state, Action<TState, ICancelable> action)
             {
                 var b = new BooleanDisposable();
-                new Thread(() =>
+                Task.Run(() =>
                 {
                     _start.Set();
                     action(state, b);
                     _stop.Set();
-                }).Start();
+                });
                 return b;
             }
 
@@ -2237,11 +2238,11 @@ namespace ReactiveTests.Tests
             public IDisposable ScheduleLongRunning<TState>(TState state, Action<TState, ICancelable> action)
             {
                 var b = new BooleanDisposable();
-                new Thread(() =>
+                Task.Run(() =>
                 {
                     action(state, b);
                     _stop.Set();
-                }).Start();
+                });
                 return b;
             }
 
@@ -8059,6 +8060,7 @@ namespace ReactiveTests.Tests
             );
         }
 
+#if !NO_THREAD
         [Fact]
         public void RepeatingTimer_Start_CatchUp()
         {
@@ -8112,6 +8114,7 @@ namespace ReactiveTests.Tests
 
             Assert.Same(err, ex);
         }
+#endif
 
         class SchedulerWithCatch : IServiceProvider, IScheduler
         {

+ 1 - 0
Rx.NET/Source/Tests.System.Reactive/Tests/Linq/QbservableTest.cs

@@ -1802,6 +1802,7 @@ namespace ReactiveTests.Tests
             var gens = m.IsGenericMethod ? string.Format("<{0}>", string.Join(", ", m.GetGenericArguments().Select(a => GetTypeName(a, correct)).ToArray())) : "";
 
             var pars = string.Join(", ", pss.Select(p => (Attribute.IsDefined(p, typeof(ParamArrayAttribute)) ? "params " : "") + GetTypeName(p.ParameterType, correct) + " " + p.Name).ToArray());
+            Attribute.
             if (Attribute.IsDefined(m, typeof(ExtensionAttribute)))
             {
                 if (pars.StartsWith("IQbservable") || pars.StartsWith("IQueryable"))

+ 7 - 2
Rx.NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/AsyncSubjectTest.cs

@@ -4,6 +4,7 @@ using System;
 using System.Reactive.Concurrency;
 using System.Reactive.Subjects;
 using System.Threading;
+using System.Threading.Tasks;
 using Microsoft.Reactive.Testing;
 using Xunit;
 
@@ -300,6 +301,7 @@ namespace ReactiveTests.Tests
         }
 
 #if HAS_AWAIT
+#if !NO_THREAD
         [Fact]
         public void Await_Blocking()
         {
@@ -313,6 +315,7 @@ namespace ReactiveTests.Tests
             var s = new AsyncSubject<int>();
             GetResult_Blocking_Throw(s.GetAwaiter());
         }
+#endif
 #endif
 
         [Fact]
@@ -323,6 +326,7 @@ namespace ReactiveTests.Tests
             ReactiveAssert.Throws<InvalidOperationException>(() => s.GetResult());
         }
 
+#if !NO_THREAD
         [Fact]
         public void GetResult_Blocking()
         {
@@ -390,6 +394,7 @@ namespace ReactiveTests.Tests
             Assert.Same(ex, y);
             Assert.True(s.IsCompleted);
         }
+#endif
 
 #if HAS_AWAIT
         [Fact]
@@ -400,7 +405,7 @@ namespace ReactiveTests.Tests
             var ctx = new MyContext();
             var e = new ManualResetEvent(false);
 
-            new Thread(() =>
+            Task.Run(() =>
             {
                 SynchronizationContext.SetSynchronizationContext(ctx);
 
@@ -409,7 +414,7 @@ namespace ReactiveTests.Tests
                 {
                     e.Set();
                 });
-            }).Start();
+            });
 
             x.OnNext(42);
             x.OnCompleted();

+ 3 - 1
Rx.NET/Source/Tests.System.Reactive/Tests/Linq/Subjects/SubjectTest.cs

@@ -442,6 +442,7 @@ namespace ReactiveTests.Tests
             ReactiveAssert.Throws<ArgumentNullException>(() => Subject.Synchronize(s, null));
         }
 
+#if !NO_THREAD
         [Fact]
         public void Subject_Synchronize1()
         {
@@ -464,7 +465,7 @@ namespace ReactiveTests.Tests
 
             Assert.Equal(Enumerable.Range(0, N).Sum(), y);
         }
-
+        
         [Fact]
         public void Subject_Synchronize2()
         {
@@ -488,6 +489,7 @@ namespace ReactiveTests.Tests
 
             Assert.Equal(Enumerable.Range(0, N).Sum(), y);
         }
+#endif
 
         [Fact]
         public void HasObservers()

+ 2 - 0
Rx.NET/Source/Tests.System.Reactive/Tests/ObserverTest.cs

@@ -731,6 +731,7 @@ namespace ReactiveTests.Tests
 #endif
         }
 
+#if !NO_THREAD
         [Fact]
         public void NotifyOn_Scheduler_OnCompleted()
         {
@@ -789,6 +790,7 @@ namespace ReactiveTests.Tests
             e.WaitOne();
             Assert.Equal(N, c);
         }
+#endif
 
         [Fact]
         public void NotifyOn_SyncCtx()

+ 4 - 0
Rx.NET/Source/Tests.System.Reactive/Tests/RegressionTest.cs

@@ -110,6 +110,7 @@ namespace ReactiveTests.Tests
             Assert.Null(xs as ISubject<int, int>);
         }
 
+#if !NO_THREAD
         [Fact]
         public void Bug_1286()
         {
@@ -124,6 +125,7 @@ namespace ReactiveTests.Tests
             //if the first doesn't this one always
             disp.Dispose();
         }
+#endif
 
         [Fact]
         public void Bug_1287()
@@ -135,6 +137,7 @@ namespace ReactiveTests.Tests
         }
 
 #if !SILVERLIGHTM7
+#if !NO_THREAD
         static IEnumerable<int> Bug_1333_Enumerable(AsyncSubject<IDisposable> s, Semaphore sema)
         {
             var d = s.First();
@@ -143,6 +146,7 @@ namespace ReactiveTests.Tests
             t.Join();
             yield return 1;
         }
+#endif
 
         [Fact]
         [Timeout(1000)]

+ 31 - 31
Rx.NET/Source/Tests.System.Reactive/project.json

@@ -15,7 +15,8 @@
     "System.Reactive.Linq": { "target": "project" },
     "System.Reactive.PlatformServices": { "target": "project" },
     "Microsoft.Reactive.Testing": { "target": "project" },
-    "System.Reactive.Experimental": {"target": "project"},
+    "System.Reactive.Experimental": { "target": "project" },
+    "System.Reactive.Providers": {"target": "project"}, 
     "xunit": "2.1.0"
   },
   
@@ -23,24 +24,23 @@
     "net45": {
       "compilationOptions": {
         "define": [
-          "NO_EVENTARGS_CONSTRAINT",
-          "HAS_EDI",
-          "HAS_WINRT",
-          "HAS_PROGRESS",
-          "PREFER_ASYNC",
-          "HAS_AWAIT",
-          "HAS_APTCA",
-          "HAS_DISPATCHER",
-          "HAS_DISPATCHER_PRIORITY",
-          "HAS_WINFORMS",
-          "USE_TIMER_SELF_ROOT"
+            "NO_EVENTARGS_CONSTRAINT",
+            "HAS_EDI",
+            "HAS_WINRT",
+            "HAS_PROGRESS",
+            "PREFER_ASYNC",
+            "HAS_AWAIT",
+            "HAS_APTCA",
+            "HAS_DISPATCHER",
+            "HAS_DISPATCHER_PRIORITY",
+            "HAS_WINFORMS",
+            "USE_TIMER_SELF_ROOT"
         ]
       },
       "dependencies": {
         "System.Reactive.Windows.Threading": { "target": "project" },
         "System.Reactive.Windows.Forms": { "target": "project" },
         "System.Reactive.Runtime.Remoting": { "target": "project" },
-        "System.Reactive.Providers": {"target": "project"}, 
         "System.Threading.Timer": "4.0.0"
       },
       "frameworkAssemblies": {
@@ -52,29 +52,29 @@
     "dotnet5.1": {
       "compilationOptions": {
         "define": [
-          "NO_EVENTARGS_CONSTRAINT",
-          "HAS_EDI",
-          "HAS_WINRT",
-          "HAS_PROGRESS",
-          "PREFER_ASYNC",
-          "HAS_AWAIT",
-          "HAS_APTCA",
-          "NO_REMOTING",
-          "NO_SERIALIZABLE",
-          "NO_THREAD",
-          "CRIPPLED_REFLECTION",
-          "PLIB",
-          "USE_TIMER_SELF_ROOT"
+            "NO_EVENTARGS_CONSTRAINT",
+            "HAS_EDI",
+            "HAS_WINRT",
+            "HAS_PROGRESS",
+            "PREFER_ASYNC",
+            "HAS_AWAIT",
+            "HAS_APTCA",
+            "NO_DISPATCHER",
+            "NO_REMOTING",
+            "NO_SERIALIZABLE",
+            "NO_THREAD",
+            "CRIPPLED_REFLECTION",
+            "PLIB",
+            "USE_TIMER_SELF_ROOT"
         ]
       },
       "dependencies": {
-        "System.Console": "4.0.0-beta-23516",
         "System.Collections.Concurrent": "4.0.0",
-        "System.Linq": "4.0.1-beta-23516",
-        "System.Threading": "4.0.11-beta-23516",
-        "System.Threading.Thread": "4.0.0-beta-23516",
+        "System.Linq": "4.0.0",
+        "System.Threading": "4.0.0",
         "System.Threading.Timer": "4.0.0",
-        "System.Runtime": "4.0.21-beta-23516"
+        "System.Runtime": "4.0.0",
+        "System.Runtime.Extensions": "4.0.0"
       }
     }
   }