#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System; using System.Threading; namespace UniRx.Async { // UniTask has no scheduler like TaskScheduler. // Only handle unobserved exception. public static class UniTaskScheduler { public static event Action UnobservedTaskException; /// /// Propagate OperationCanceledException to UnobservedTaskException when true. Default is false. /// public static bool PropagateOperationCanceledException = false; /// /// Write log type when catch unobserved exception and not registered UnobservedTaskException. Default is Warning. /// public static UnityEngine.LogType UnobservedExceptionWriteLogType = UnityEngine.LogType.Warning; /// /// Dispatch exception event to Unity MainThread. /// public static bool DispatchUnityMainThread = true; // cache delegate. static readonly SendOrPostCallback handleExceptionInvoke = InvokeUnobservedTaskException; internal static void PublishUnobservedTaskException(Exception ex) { if (ex != null) { if (!PropagateOperationCanceledException && ex is OperationCanceledException) { return; } if (UnobservedTaskException != null) { if (Thread.CurrentThread.ManagedThreadId == PlayerLoopHelper.MainThreadId) { // allows inlining call. UnobservedTaskException.Invoke(ex); } else { // Post to MainThread. PlayerLoopHelper.UnitySynchronizationContext.Post(handleExceptionInvoke, ex); } } else { string msg = null; if (UnobservedExceptionWriteLogType != UnityEngine.LogType.Exception) { msg = "UnobservedTaskException:" + ex.ToString(); } switch (UnobservedExceptionWriteLogType) { case UnityEngine.LogType.Error: UnityEngine.Debug.LogError(msg); break; case UnityEngine.LogType.Assert: UnityEngine.Debug.LogAssertion(msg); break; case UnityEngine.LogType.Warning: UnityEngine.Debug.LogWarning(msg); break; case UnityEngine.LogType.Log: UnityEngine.Debug.Log(msg); break; case UnityEngine.LogType.Exception: UnityEngine.Debug.LogException(ex); break; default: break; } } } } static void InvokeUnobservedTaskException(object state) { UnobservedTaskException((Exception)state); } } } #endif