Browse Source

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

pull/8304/head
Giuseppe Lippolis 4 years ago
parent
commit
3b9a34274a
  1. 2
      src/Avalonia.Base/Threading/Dispatcher.cs
  2. 9
      src/Avalonia.Base/Threading/IDispatcher.cs
  3. 14
      src/Avalonia.Base/Threading/JobRunner.cs
  4. 3
      tests/Avalonia.UnitTests/ImmediateDispatcher.cs

2
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
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>

14
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;

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

Loading…
Cancel
Save