Browse Source
Merge pull request #12240 from AvaloniaUI/feature/sync-context-accept-dispatcher
Make dispatcher more usable on non-ui threads
pull/12245/head
Dan Walmsley
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with
8 additions and
7 deletions
-
src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs
-
src/Avalonia.Base/Threading/Dispatcher.Invoke.cs
-
src/Avalonia.Base/Threading/Dispatcher.MainLoop.cs
-
src/Avalonia.Base/Threading/DispatcherOperation.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 |
|
|
|
&& avaloniaContext.Priority == priority) |
|
|
|
return default; |
|
|
|
var oldContext = Current; |
|
|
|
Dispatcher.UIThread.VerifyAccess(); |
|
|
|
SetSynchronizationContext(Dispatcher.UIThread.GetContextWithPriority(priority)); |
|
|
|
dispatcher.VerifyAccess(); |
|
|
|
SetSynchronizationContext(dispatcher.GetContextWithPriority(priority)); |
|
|
|
return new RestoreContext(oldContext); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -106,7 +106,7 @@ public partial class Dispatcher |
|
|
|
// call the callback directly.
|
|
|
|
if (!cancellationToken.IsCancellationRequested && priority == DispatcherPriority.Send && CheckAccess()) |
|
|
|
{ |
|
|
|
using (AvaloniaSynchronizationContext.Ensure(priority)) |
|
|
|
using (AvaloniaSynchronizationContext.Ensure(this, priority)) |
|
|
|
callback(); |
|
|
|
return; |
|
|
|
} |
|
|
|
@ -228,7 +228,7 @@ public partial class Dispatcher |
|
|
|
// call the callback directly.
|
|
|
|
if (!cancellationToken.IsCancellationRequested && priority == DispatcherPriority.Send && CheckAccess()) |
|
|
|
{ |
|
|
|
using (AvaloniaSynchronizationContext.Ensure(priority)) |
|
|
|
using (AvaloniaSynchronizationContext.Ensure(this, priority)) |
|
|
|
return callback(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -49,7 +49,7 @@ public partial class Dispatcher |
|
|
|
try |
|
|
|
{ |
|
|
|
_frames.Push(frame); |
|
|
|
using (AvaloniaSynchronizationContext.Ensure(DispatcherPriority.Normal)) |
|
|
|
using (AvaloniaSynchronizationContext.Ensure(this, DispatcherPriority.Normal)) |
|
|
|
frame.Run(_controlledImpl); |
|
|
|
} |
|
|
|
finally |
|
|
|
|
|
|
|
@ -258,7 +258,7 @@ public class DispatcherOperation |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
using (AvaloniaSynchronizationContext.Ensure(Priority)) |
|
|
|
using (AvaloniaSynchronizationContext.Ensure(Dispatcher, Priority)) |
|
|
|
InvokeCore(); |
|
|
|
} |
|
|
|
finally |
|
|
|
|