public async Task <UriFetcher> Fetch() { HttpStatusCode?code = null; byte[] buffer = new byte[0]; WebResponse response = null; var webRequest = WebRequest.Create(Task.Uri); try { response = await webRequest.GetResponseAsync(); var stream = response.GetResponseStream(); buffer = await ReadFullyAsync(stream); stream.Dispose(); if (response is HttpWebResponse) { code = (response as HttpWebResponse).StatusCode; } } catch (WebException we) { if (we.Response is HttpWebResponse) { var exresponse = we.Response as HttpWebResponse; code = exresponse.StatusCode; response = exresponse; } } finally { Completed = true; CompletedTask = new CompletedTask(); CompletedTask.FetchedDocument = new WebDocument(data: buffer, headers: response?.Headers, uri: Task.Uri, statusCode: code, contentType: response?.ContentType); CompletedTask.Task = Task; } return(this); }