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);
}