TaskExtensions.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using Xamarin.Forms;
  6. namespace InABox.Mobile.Shared
  7. {
  8. public struct SynchronizationContextAwaiter : INotifyCompletion
  9. {
  10. private static readonly SendOrPostCallback _postCallback = state => ((Action)state)();
  11. private readonly SynchronizationContext _context;
  12. public SynchronizationContextAwaiter(SynchronizationContext context)
  13. {
  14. _context = context;
  15. }
  16. public bool IsCompleted => _context == SynchronizationContext.Current;
  17. public void OnCompleted(Action continuation) => _context.Post(_postCallback, continuation);
  18. public void GetResult() { }
  19. }
  20. public static class TaskExtensions
  21. {
  22. public static void BeginInvokeOnMainThread(this Task task, Action<Task> action)
  23. {
  24. task.ContinueWith((task) =>
  25. {
  26. Device.BeginInvokeOnMainThread(() => action(task));
  27. });
  28. }
  29. public static SynchronizationContextAwaiter GetAwaiter(this SynchronizationContext context)
  30. {
  31. return new SynchronizationContextAwaiter(context);
  32. }
  33. }
  34. }