public override async Task <RequestResponse> ExecuteRequest(Service service2, ApiLibs.Request request) { var coapRequest = new Com.AugustCellars.CoAP.Request(ConvertToMethod(request.Method)) { UriPath = request.EndPoint }; if (request.Content != null) { coapRequest.SetPayload(AddBody(request.Content)); } // this is done on purpose to handle ObserveDevice from DeviceController if (request is WatchRequest watch) { coapRequest.MarkObserve(); coapRequest.Respond += (object sender, ResponseEventArgs e) => { watch.EventHandler?.Invoke(coapRequest.Response); }; } if (request is EndPointRequest <object> a) { coapRequest.EndPoint = a.DTLSEndPoint; } Task <Response> requestTask = new Task <Response>(() => { return(_coapClient.Send(coapRequest)); }); requestTask.Start(); Response resp = await requestTask; if (resp == null) { throw new Exception("Request timed out"); } var responseApiLibs = new RequestResponse((System.Net.HttpStatusCode)MapToHttpStatusCode(resp.StatusCode), resp.StatusCode.ToString(), resp.UriQuery, "", resp.ResponseText, resp, request, service2); if (resp.IsTimedOut) { throw new RequestTimeoutResponse(responseApiLibs).ToException(); } return(responseApiLibs); }