public TaskResult Wait(string delegationId, Action action, TimeSpan timeout) { var waiting = new Waiting(); lock (AwaitingsMutex) Awaitings.Add(delegationId, waiting); action(); try { return(waiting.Wait(timeout)); } catch (Exception) { lock (AwaitingsMutex) Awaitings.Remove(delegationId); throw; } }