|
|
@@ -1,3 +1,5 @@
|
|
|
+using System;
|
|
|
+using System.Runtime.ConstrainedExecution;
|
|
|
using System.Threading;
|
|
|
|
|
|
namespace Avalonia.Threading
|
|
|
@@ -7,6 +9,20 @@ namespace Avalonia.Threading
|
|
|
/// </summary>
|
|
|
public class AvaloniaSynchronizationContext : SynchronizationContext
|
|
|
{
|
|
|
+ public interface INonPumpingPlatformWaitProvider
|
|
|
+ {
|
|
|
+ int Wait(IntPtr[] waitHandles, bool waitAll, int millisecondsTimeout);
|
|
|
+ }
|
|
|
+
|
|
|
+ private readonly INonPumpingPlatformWaitProvider _waitProvider;
|
|
|
+
|
|
|
+ public AvaloniaSynchronizationContext(INonPumpingPlatformWaitProvider waitProvider)
|
|
|
+ {
|
|
|
+ _waitProvider = waitProvider;
|
|
|
+ if (_waitProvider != null)
|
|
|
+ SetWaitNotificationRequired();
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Controls if SynchronizationContext should be installed in InstallIfNeeded. Used by Designer.
|
|
|
/// </summary>
|
|
|
@@ -22,7 +38,8 @@ namespace Avalonia.Threading
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- SetSynchronizationContext(new AvaloniaSynchronizationContext());
|
|
|
+ SetSynchronizationContext(new AvaloniaSynchronizationContext(AvaloniaLocator.Current
|
|
|
+ .GetService<INonPumpingPlatformWaitProvider>()));
|
|
|
}
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
@@ -39,5 +56,13 @@ namespace Avalonia.Threading
|
|
|
else
|
|
|
Dispatcher.UIThread.InvokeAsync(() => d(state), DispatcherPriority.Send).Wait();
|
|
|
}
|
|
|
+
|
|
|
+ [PrePrepareMethod]
|
|
|
+ public override int Wait(IntPtr[] waitHandles, bool waitAll, int millisecondsTimeout)
|
|
|
+ {
|
|
|
+ if (_waitProvider != null)
|
|
|
+ return _waitProvider.Wait(waitHandles, waitAll, millisecondsTimeout);
|
|
|
+ return base.Wait(waitHandles, waitAll, millisecondsTimeout);
|
|
|
+ }
|
|
|
}
|
|
|
}
|