You've already forked Commercialization.topon
56 lines
1.2 KiB
C#
56 lines
1.2 KiB
C#
|
|
using System;
|
||
|
|
using System.Threading;
|
||
|
|
using UnityEngine;
|
||
|
|
|
||
|
|
public static class ToponUnityThread
|
||
|
|
{
|
||
|
|
private static readonly object SyncRoot = new object();
|
||
|
|
|
||
|
|
private static SynchronizationContext _unityContext;
|
||
|
|
private static int _mainThreadId = -1;
|
||
|
|
|
||
|
|
public static void Initialize()
|
||
|
|
{
|
||
|
|
if (SynchronizationContext.Current == null)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
lock (SyncRoot)
|
||
|
|
{
|
||
|
|
_unityContext = SynchronizationContext.Current;
|
||
|
|
_mainThreadId = Thread.CurrentThread.ManagedThreadId;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void Post(Action action)
|
||
|
|
{
|
||
|
|
if (action == null)
|
||
|
|
{
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
var context = _unityContext;
|
||
|
|
var currentThreadId = Thread.CurrentThread.ManagedThreadId;
|
||
|
|
if (context == null || currentThreadId == _mainThreadId)
|
||
|
|
{
|
||
|
|
SafeInvoke(action);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
context.Post(_ => SafeInvoke(action), null);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static void SafeInvoke(Action action)
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
action();
|
||
|
|
}
|
||
|
|
catch (Exception exception)
|
||
|
|
{
|
||
|
|
Debug.LogException(exception);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|