Browse Source

Make dispatcher more usable on non-ui threads

pull/12240/head
Nikita Tsukanov 3 years ago
parent
commit
7c4ce4bca3
  1. 7
      src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs
  2. 4
      src/Avalonia.Base/Threading/Dispatcher.Invoke.cs
  3. 2
      src/Avalonia.Base/Threading/Dispatcher.MainLoop.cs
  4. 2
      src/Avalonia.Base/Threading/DispatcherOperation.cs

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

@ -99,14 +99,15 @@ namespace Avalonia.Threading
} }
} }
public static RestoreContext Ensure(DispatcherPriority priority) public static RestoreContext Ensure(DispatcherPriority priority) => Ensure(Dispatcher.UIThread, priority);
public static RestoreContext Ensure(Dispatcher dispatcher, DispatcherPriority priority)
{ {
if (Current is AvaloniaSynchronizationContext avaloniaContext if (Current is AvaloniaSynchronizationContext avaloniaContext
&& avaloniaContext.Priority == priority) && avaloniaContext.Priority == priority)
return default; return default;
var oldContext = Current; var oldContext = Current;
Dispatcher.UIThread.VerifyAccess(); dispatcher.VerifyAccess();
SetSynchronizationContext(Dispatcher.UIThread.GetContextWithPriority(priority)); SetSynchronizationContext(dispatcher.GetContextWithPriority(priority));
return new RestoreContext(oldContext); return new RestoreContext(oldContext);
} }
} }

4
src/Avalonia.Base/Threading/Dispatcher.Invoke.cs

@ -106,7 +106,7 @@ public partial class Dispatcher
// call the callback directly. // call the callback directly.
if (!cancellationToken.IsCancellationRequested && priority == DispatcherPriority.Send && CheckAccess()) if (!cancellationToken.IsCancellationRequested && priority == DispatcherPriority.Send && CheckAccess())
{ {
using (AvaloniaSynchronizationContext.Ensure(priority)) using (AvaloniaSynchronizationContext.Ensure(this, priority))
callback(); callback();
return; return;
} }
@ -228,7 +228,7 @@ public partial class Dispatcher
// call the callback directly. // call the callback directly.
if (!cancellationToken.IsCancellationRequested && priority == DispatcherPriority.Send && CheckAccess()) if (!cancellationToken.IsCancellationRequested && priority == DispatcherPriority.Send && CheckAccess())
{ {
using (AvaloniaSynchronizationContext.Ensure(priority)) using (AvaloniaSynchronizationContext.Ensure(this, priority))
return callback(); return callback();
} }

2
src/Avalonia.Base/Threading/Dispatcher.MainLoop.cs

@ -49,7 +49,7 @@ public partial class Dispatcher
try try
{ {
_frames.Push(frame); _frames.Push(frame);
using (AvaloniaSynchronizationContext.Ensure(DispatcherPriority.Normal)) using (AvaloniaSynchronizationContext.Ensure(this, DispatcherPriority.Normal))
frame.Run(_controlledImpl); frame.Run(_controlledImpl);
} }
finally finally

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

@ -258,7 +258,7 @@ public class DispatcherOperation
try try
{ {
using (AvaloniaSynchronizationContext.Ensure(Priority)) using (AvaloniaSynchronizationContext.Ensure(Dispatcher, Priority))
InvokeCore(); InvokeCore();
} }
finally finally

Loading…
Cancel
Save