Browse Source

Allow Dispatcher to be implicitly cast to TaskScheduler

pull/21032/head
Tom Edwards 6 months ago
parent
commit
d84957f1f6
  1. 31
      src/Avalonia.Base/Threading/Dispatcher.TaskScheduler.cs
  2. 11
      tests/Avalonia.Base.UnitTests/DispatcherTests.cs

31
src/Avalonia.Base/Threading/Dispatcher.TaskScheduler.cs

@ -0,0 +1,31 @@
using System.Threading;
using System.Threading.Tasks;
namespace Avalonia.Threading;
public partial class Dispatcher
{
private TaskScheduler? _taskScheduler;
public static implicit operator TaskScheduler(Dispatcher dispatcher)
{
lock (dispatcher.InstanceLock)
{
if (dispatcher._taskScheduler == null)
{
var prevContext = SynchronizationContext.Current;
SynchronizationContext.SetSynchronizationContext(dispatcher.GetContextWithPriority(DispatcherPriority.Default));
try
{
dispatcher._taskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
}
finally
{
SynchronizationContext.SetSynchronizationContext(prevContext);
}
}
}
return dispatcher._taskScheduler;
}
}

11
tests/Avalonia.Base.UnitTests/DispatcherTests.cs

@ -764,4 +764,15 @@ public partial class DispatcherTests
}
}
[Fact]
public async Task Dispatcher_Can_Act_As_TaskScheduler()
{
var impl = new SimpleDispatcherImpl();
Dispatcher.InitializeUIThreadDispatcher(impl);
Thread? continuationThread = null;
_ = Task.CompletedTask.ContinueWith(t => continuationThread = Thread.CurrentThread, Dispatcher.UIThread);
Assert.True(impl.AskedForSignal);
impl.ExecuteSignal();
Assert.Equal(Dispatcher.UIThread.Thread, continuationThread);
}
}

Loading…
Cancel
Save