50 lines
1.3 KiB
C#
50 lines
1.3 KiB
C#
|
using System;
|
|||
|
using System.Threading;
|
|||
|
|
|||
|
using Codice.LogWrapper;
|
|||
|
|
|||
|
namespace Unity.PlasticSCM.Editor.UI
|
|||
|
{
|
|||
|
internal static class GUIActionRunner
|
|||
|
{
|
|||
|
internal delegate void ActionDelegate();
|
|||
|
|
|||
|
internal static void RunGUIAction(ActionDelegate action)
|
|||
|
{
|
|||
|
if (EditorDispatcher.IsOnMainThread)
|
|||
|
{
|
|||
|
action();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
lock (mLock)
|
|||
|
{
|
|||
|
ManualResetEvent syncEvent = new ManualResetEvent(false);
|
|||
|
|
|||
|
EditorDispatcher.Dispatch(delegate {
|
|||
|
try
|
|||
|
{
|
|||
|
action();
|
|||
|
}
|
|||
|
catch (Exception e)
|
|||
|
{
|
|||
|
mLog.ErrorFormat("GUI action failed: {0}", e.Message);
|
|||
|
mLog.DebugFormat("Stack trace:{0}{1}", Environment.NewLine, e.StackTrace);
|
|||
|
throw;
|
|||
|
}
|
|||
|
finally
|
|||
|
{
|
|||
|
syncEvent.Set();
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
syncEvent.WaitOne();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static object mLock = new object();
|
|||
|
|
|||
|
static readonly ILog mLog = PlasticApp.GetLogger("GUIActionRunner");
|
|||
|
}
|
|||
|
}
|