Browse Source

feat(IDispatcher): Add void Post(Action<object> action,object arg, DispatcherPriority priority = default);

Giuseppe Lippolis 3 years ago
parent
commit
3b9a34274a

+ 1 - 1
src/Avalonia.Base/Threading/Dispatcher.cs

@@ -118,7 +118,7 @@ namespace Avalonia.Threading
         }
 
         /// <inheritdoc/>
-        public void Post<T>(Action<T> action, T arg, DispatcherPriority priority = default)
+        public void Post(SendOrPostCallback action, object? arg, DispatcherPriority priority = default)
         {
             _ = action ?? throw new ArgumentNullException(nameof(action));
             _jobRunner.Post(action, arg, priority);

+ 9 - 0
src/Avalonia.Base/Threading/IDispatcher.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace Avalonia.Threading
@@ -26,6 +27,14 @@ namespace Avalonia.Threading
         /// <param name="priority">The priority with which to invoke the method.</param>
         void Post(Action action, DispatcherPriority priority = default);
 
+        /// <summary>
+        /// Posts an action that will be invoked on the dispatcher thread.
+        /// </summary>
+        /// <param name="action">The method.</param>
+        /// <param name="arg">The argument of method to call.</param>
+        /// <param name="priority">The priority with which to invoke the method.</param>
+        void Post(SendOrPostCallback action, object? arg, DispatcherPriority priority = default);
+
         /// <summary>
         /// Invokes a action on the dispatcher thread.
         /// </summary>

+ 7 - 7
src/Avalonia.Base/Threading/JobRunner.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using Avalonia.Platform;
 
@@ -81,9 +82,9 @@ namespace Avalonia.Threading
         /// <param name="action">The method to call.</param>
         /// <param name="parameter">The parameter of method to call.</param>
         /// <param name="priority">The priority with which to invoke the method.</param>
-        internal void Post<T>(Action<T> action, T parameter, DispatcherPriority priority)
+        internal void Post(SendOrPostCallback action, object? parameter, DispatcherPriority priority)
         {
-            AddJob(new Job<T>(action, parameter, priority, true));
+            AddJob(new JobWithArg(action, parameter, priority, true));
         }
 
         /// <summary>
@@ -207,11 +208,10 @@ namespace Avalonia.Threading
         /// <summary>
         /// A typed job to run.
         /// </summary>
-        /// <typeparam name="T">Type of job parameter</typeparam>
-        private sealed class Job<T> : IJob
+        private sealed class JobWithArg : IJob
         {
-            private readonly Action<T> _action;
-            private readonly T _parameter;
+            private readonly SendOrPostCallback _action;
+            private readonly object? _parameter;
             private readonly TaskCompletionSource<bool>? _taskCompletionSource;
 
             /// <summary>
@@ -222,7 +222,7 @@ namespace Avalonia.Threading
             /// <param name="priority">The job priority.</param>
             /// <param name="throwOnUiThread">Do not wrap exception in TaskCompletionSource</param>
 
-            public Job(Action<T> action, T parameter, DispatcherPriority priority, bool throwOnUiThread)
+            public JobWithArg(SendOrPostCallback action, object? parameter, DispatcherPriority priority, bool throwOnUiThread)
             {
                 _action = action;
                 _parameter = parameter;

+ 2 - 1
tests/Avalonia.UnitTests/ImmediateDispatcher.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Threading;
 using System.Threading.Tasks;
 using Avalonia.Threading;
 
@@ -22,7 +23,7 @@ namespace Avalonia.UnitTests
         }
 
         /// <inheritdoc/>
-        public void Post<T>(Action<T> action, T arg, DispatcherPriority priority)
+        public void Post(SendOrPostCallback action, object arg, DispatcherPriority priority)
         {
             action(arg);
         }