UnityThreadUtilsInternal.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. namespace Unity.Services.Core.Threading.Internal
  5. {
  6. class UnityThreadUtilsInternal : IUnityThreadUtils
  7. {
  8. public static Task PostAsync(Action action)
  9. {
  10. return Task.Factory.StartNew(
  11. action, CancellationToken.None, TaskCreationOptions.None, UnityThreadUtils.UnityThreadScheduler);
  12. }
  13. public static Task PostAsync(Action<object> action, object state)
  14. {
  15. return Task.Factory.StartNew(
  16. action, state, CancellationToken.None, TaskCreationOptions.None,
  17. UnityThreadUtils.UnityThreadScheduler);
  18. }
  19. public static Task<T> PostAsync<T>(Func<T> action)
  20. {
  21. return Task<T>.Factory.StartNew(
  22. action, CancellationToken.None, TaskCreationOptions.None, UnityThreadUtils.UnityThreadScheduler);
  23. }
  24. public static Task<T> PostAsync<T>(Func<object, T> action, object state)
  25. {
  26. return Task<T>.Factory.StartNew(
  27. action, state, CancellationToken.None, TaskCreationOptions.None,
  28. UnityThreadUtils.UnityThreadScheduler);
  29. }
  30. public static void Send(Action action)
  31. {
  32. if (UnityThreadUtils.IsRunningOnUnityThread)
  33. {
  34. action();
  35. return;
  36. }
  37. PostAsync(action).Wait();
  38. }
  39. public static void Send(Action<object> action, object state)
  40. {
  41. if (UnityThreadUtils.IsRunningOnUnityThread)
  42. {
  43. action(state);
  44. return;
  45. }
  46. PostAsync(action, state).Wait();
  47. }
  48. public static T Send<T>(Func<T> action)
  49. {
  50. if (UnityThreadUtils.IsRunningOnUnityThread)
  51. {
  52. return action();
  53. }
  54. var task = PostAsync(action);
  55. task.Wait();
  56. return task.Result;
  57. }
  58. public static T Send<T>(Func<object, T> action, object state)
  59. {
  60. if (UnityThreadUtils.IsRunningOnUnityThread)
  61. {
  62. return action(state);
  63. }
  64. var task = PostAsync(action, state);
  65. task.Wait();
  66. return task.Result;
  67. }
  68. bool IUnityThreadUtils.IsRunningOnUnityThread => UnityThreadUtils.IsRunningOnUnityThread;
  69. Task IUnityThreadUtils.PostAsync(Action action) => PostAsync(action);
  70. Task IUnityThreadUtils.PostAsync(Action<object> action, object state) => PostAsync(action, state);
  71. Task<T> IUnityThreadUtils.PostAsync<T>(Func<T> action) => PostAsync(action);
  72. Task<T> IUnityThreadUtils.PostAsync<T>(Func<object, T> action, object state) => PostAsync(action, state);
  73. void IUnityThreadUtils.Send(Action action) => Send(action);
  74. void IUnityThreadUtils.Send(Action<object> action, object state) => Send(action, state);
  75. T IUnityThreadUtils.Send<T>(Func<T> action) => Send(action);
  76. T IUnityThreadUtils.Send<T>(Func<object, T> action, object state) => Send(action, state);
  77. }
  78. }