public static Action <Object> TaskCreateWrapper(ClrSyncManager manager) { return (delegate(Object o) { try { TaskArg p = (TaskArg)o; p.e.Set(); manager.ThreadBegin(p.s); MChessChess.LeaveChess(); Exception exception = null; try { var tryExecuteTask = p.taskScheduler.GetType().GetMethod("TryExecuteTask", global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance); tryExecuteTask.Invoke(p.taskScheduler, new object[] { p.task }); } catch (Exception e) // catch recoverable exception in user code { exception = e; } MChessChess.EnterChess(); manager.SetMethodInfo("Task.End"); manager.AggregateSyncVarAccess( new object[] { p.task, ((IAsyncResult)p.task).AsyncWaitHandle }, MSyncVarOp.RWEVENT); manager.CommitSyncVarAccess(); if (manager.BreakDeadlockMode) { MChessChess.WakeNextDeadlockedThread(false, true); } else if (exception == null) { manager.ThreadEnd(Original::Thread.CurrentThread); } else { manager.Shutdown(exception); } } catch (Exception e) // catch fatal exception in our code { manager.Shutdown(e); } }); }