public R ProcessRequest <R>(ProcessId pid, object message) { try { if (request != null) { throw new Exception("async ask not allowed"); } response = null; request = new AutoResetEvent(false); sys.Ask(pid, new ActorRequest(message, pid, Self, 0), Self); request.WaitOne(sys.Settings.Timeout); if (response == null) { throw new TimeoutException("Request timed out"); } else { if (response.IsFaulted) { var ex = (Exception)response.Message; throw new ProcessException($"Process issue: {ex.Message}", pid.Path, Self.Path, ex); } else { return((R)response.Message); } } } finally { if (request != null) { request.Dispose(); request = null; } } }