Browse Source

Merge pull request #8304 from workgroupengineering/features/Issue_8298

feat(IDispatcher): Add void Post(Action<object> action,object arg, Di…
upgrade-angle
Max Katz 4 years ago
committed by GitHub
parent
commit
709ad86626
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs
  2. 2
      src/Avalonia.Base/Threading/Dispatcher.cs
  3. 9
      src/Avalonia.Base/Threading/IDispatcher.cs
  4. 14
      src/Avalonia.Base/Threading/JobRunner.cs
  5. 3
      tests/Avalonia.UnitTests/ImmediateDispatcher.cs

2
src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs

@ -30,7 +30,7 @@ namespace Avalonia.Threading
/// <inheritdoc/>
public override void Post(SendOrPostCallback d, object? state)
{
Dispatcher.UIThread.Post(() => d(state), DispatcherPriority.Background);
Dispatcher.UIThread.Post(d, state, DispatcherPriority.Background);
}
/// <inheritdoc/>

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