public async Task <T> Request <T>(string target, int handle, params object[] payloads) where T : new() { var response = default(T); var task = new ThreadLock(); var wrapped = new EventRequest(new EventCallback(metadata => { Logger.Debug( $"[{metadata.Inherit}] Got request response from client `{handle}` with metadata {JsonConvert.SerializeObject(metadata)}"); try { response = JsonConvert.DeserializeObject <T>(metadata.Find <string>("__response")); } catch (Exception) { Logger.Info($"[{metadata.Inherit}] Event request response returned an invalid type."); } task.Unlock(); return(response); })) { Target = target, Sender = -1 }; if (payloads != null && payloads.Length > 0) { WriteMetadata(wrapped, payloads); } Send(wrapped, handle); PendingRequests.Add(wrapped); await task.Wait(); return(response); }