private async Task <CMPHttpResponse> PerformAsync()
        {
            if (_requestMessage == null)
            {
                return(null);
            }

            var httpResponseTask = Task.Run(async() =>
            {
                try
                {
                    HttpResponseMessage responseMessage = await _httpClient.SendAsync(_requestMessage, _tokenSource.Token);
                    string responseRead          = null;
                    CMPHttpResponse httpResponse = null;
                    if (responseMessage == null)
                    {
                        return(null);
                    }

                    if (responseMessage.StatusCode != HttpStatusCode.OK)
                    {
                        return(new CMPHttpResponse(responseMessage.ReasonPhrase, responseMessage.StatusCode, 0));
                    }

                    responseRead = await responseMessage.Content?.ReadAsStringAsync();
                    httpResponse = new CMPHttpResponse(responseRead, responseMessage.StatusCode, 0);
                    return(httpResponse);
                }
                catch (WebException exception)
                {
                    var httpResponse = new CMPHttpResponse(exception.Message, 0, exception.Status);
                    return(httpResponse);
                }
                catch (AggregateException exception)
                {
                    var httpResponse = new CMPHttpResponse(exception.Message, 0, 0);
                    return(httpResponse);
                }
                catch (Exception exception)
                {
                    var httpResponse = new CMPHttpResponse(exception.Message, 0, 0);
                    return(httpResponse);
                }
            });

            await httpResponseTask;

            return(httpResponseTask.Result);
        }
        public async Task GetBytesWithProgressAsync(ProgressCallback callback)
        {
            if ((_requestMessage == null) || (callback == null))
            {
                return;
            }

            int noOfBytesRead    = 0;
            int totalBytesToRead = 0;

            try
            {
                Task <HttpResponseMessage> httpResponseTask = Task.Run(async() => await _httpClient
                                                                       .GetAsync(_httpURLString,
                                                                                 HttpCompletionOption.ResponseHeadersRead,
                                                                                 _tokenSource.Token));

                await httpResponseTask;
                HttpResponseMessage responseMessage = httpResponseTask.Result;

                Task <byte[]> responseByteTask = Task.Run(async() => await
                                                          responseMessage.Content.ReadAsByteArrayAsync());
                await responseByteTask;

                Task <Stream> responseStreamTask = Task.Run(async() => await responseMessage.Content.ReadAsStreamAsync());
                await         responseStreamTask;

                Stream responseStream = responseStreamTask.Result;
                byte[] responseBytes  = responseByteTask.Result;
                totalBytesToRead = responseBytes.Length;

                string          responseString = null;
                byte[]          buffer         = null;
                CMPHttpResponse httpResponse   = null;

                while (true)
                {
                    buffer = new byte[_chunkBufferSize];
                    int bytesRead = 0;

                    bytesRead = await responseStream.ReadAsync(buffer, 0, buffer.Length);

                    if (bytesRead == 0)
                    {
                        break;
                    }

                    noOfBytesRead += bytesRead;
                    responseString = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);

                    httpResponse = new CMPHttpResponse(responseString, responseMessage.StatusCode, 0);
                    callback.Invoke(httpResponse, noOfBytesRead, totalBytesToRead);
                }
            }
            catch (WebException ex)
            {
                var httpResponse = new CMPHttpResponse(ex.Message, 0, ex.Status);
                callback.Invoke(httpResponse, noOfBytesRead, totalBytesToRead);
            }
            catch (AggregateException ex)
            {
                var httpResponse = new CMPHttpResponse(ex.Message, 0, 0);
                callback.Invoke(httpResponse, noOfBytesRead, totalBytesToRead);
            }
            catch (Exception ex)
            {
                var httpResponse = new CMPHttpResponse(ex.Message, 0, 0);
                callback.Invoke(httpResponse, noOfBytesRead, totalBytesToRead);
            }
        }