From 3b9a34274a31ebccf7fb3fa9f7e280203b01c0cc Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Wed, 8 Jun 2022 09:35:02 +0200 Subject: [PATCH] feat(IDispatcher): Add void Post(Action action,object arg, DispatcherPriority priority = default); --- src/Avalonia.Base/Threading/Dispatcher.cs | 2 +- src/Avalonia.Base/Threading/IDispatcher.cs | 9 +++++++++ src/Avalonia.Base/Threading/JobRunner.cs | 14 +++++++------- tests/Avalonia.UnitTests/ImmediateDispatcher.cs | 3 ++- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Base/Threading/Dispatcher.cs b/src/Avalonia.Base/Threading/Dispatcher.cs index 2eb2e7c01f..571f782813 100644 --- a/src/Avalonia.Base/Threading/Dispatcher.cs +++ b/src/Avalonia.Base/Threading/Dispatcher.cs @@ -118,7 +118,7 @@ namespace Avalonia.Threading } /// - public void Post(Action 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); diff --git a/src/Avalonia.Base/Threading/IDispatcher.cs b/src/Avalonia.Base/Threading/IDispatcher.cs index 713a7ac4d7..1c700132b7 100644 --- a/src/Avalonia.Base/Threading/IDispatcher.cs +++ b/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 /// The priority with which to invoke the method. void Post(Action action, DispatcherPriority priority = default); + /// + /// Posts an action that will be invoked on the dispatcher thread. + /// + /// The method. + /// The argument of method to call. + /// The priority with which to invoke the method. + void Post(SendOrPostCallback action, object? arg, DispatcherPriority priority = default); + /// /// Invokes a action on the dispatcher thread. /// diff --git a/src/Avalonia.Base/Threading/JobRunner.cs b/src/Avalonia.Base/Threading/JobRunner.cs index 4b304d44f6..ced3423c27 100644 --- a/src/Avalonia.Base/Threading/JobRunner.cs +++ b/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 /// The method to call. /// The parameter of method to call. /// The priority with which to invoke the method. - internal void Post(Action action, T parameter, DispatcherPriority priority) + internal void Post(SendOrPostCallback action, object? parameter, DispatcherPriority priority) { - AddJob(new Job(action, parameter, priority, true)); + AddJob(new JobWithArg(action, parameter, priority, true)); } /// @@ -207,11 +208,10 @@ namespace Avalonia.Threading /// /// A typed job to run. /// - /// Type of job parameter - private sealed class Job : IJob + private sealed class JobWithArg : IJob { - private readonly Action _action; - private readonly T _parameter; + private readonly SendOrPostCallback _action; + private readonly object? _parameter; private readonly TaskCompletionSource? _taskCompletionSource; /// @@ -222,7 +222,7 @@ namespace Avalonia.Threading /// The job priority. /// Do not wrap exception in TaskCompletionSource - public Job(Action action, T parameter, DispatcherPriority priority, bool throwOnUiThread) + public JobWithArg(SendOrPostCallback action, object? parameter, DispatcherPriority priority, bool throwOnUiThread) { _action = action; _parameter = parameter; diff --git a/tests/Avalonia.UnitTests/ImmediateDispatcher.cs b/tests/Avalonia.UnitTests/ImmediateDispatcher.cs index 03c89732f3..f6f3de3bc6 100644 --- a/tests/Avalonia.UnitTests/ImmediateDispatcher.cs +++ b/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 } /// - public void Post(Action action, T arg, DispatcherPriority priority) + public void Post(SendOrPostCallback action, object arg, DispatcherPriority priority) { action(arg); }