private async Task<JObject> SendRequestAsync(string action, params JProperty[] args) { var requestId = Guid.NewGuid().ToString(); var requestInfo = new RequestInfo(); lock (_requests) { _requests.Add(requestId, requestInfo); } var commonProperties = new[] { new JProperty("action", action), new JProperty("requestId", requestId) }; var requestJson = new JObject(commonProperties.Concat(args).Cast<object>().ToArray()); _webSocket.Send(requestJson.ToString()); var resultTask = await Task.WhenAny(requestInfo.Task, Task.Delay(Timeout)); if (resultTask != requestInfo.Task) throw new DeviceHiveException("Timeout while waiting for server response!"); var result = requestInfo.Task.Result; var status = (string)result["status"]; if (status == "error") throw new DeviceHiveException((string)result["error"]); return result; }