浏览代码

Adding scheduler using SynchronizationContext.

Bart De Smet 8 年之前
父节点
当前提交
1477dc9f7d

+ 37 - 0
AsyncRx.NET/System.Reactive.Async.Concurrency/System/Reactive/Concurrency/SynchronizationContextAsyncScheduler.cs

@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the Apache 2.0 License.
+// See the LICENSE file in the project root for more information. 
+
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace System.Reactive.Concurrency
+{
+    public sealed class SynchronizationContextAsyncScheduler : AsyncSchedulerBase
+    {
+        private readonly SynchronizationContext _context;
+
+        public SynchronizationContextAsyncScheduler(SynchronizationContext context)
+        {
+            if (context == null)
+                throw new ArgumentNullException(nameof(context));
+
+            _context = context;
+        }
+
+        protected override Task Delay(TimeSpan dueTime, CancellationToken token) => Task.Delay(dueTime, token);
+
+        protected override Task ScheduleAsyncCore(Func<CancellationToken, Task> action, CancellationToken token)
+        {
+            _context.Post(_ =>
+            {
+                if (!token.IsCancellationRequested)
+                {
+                    action(token);
+                }
+            }, null);
+
+            return Task.CompletedTask;
+        }
+    }
+}