private void ResponseDownloadCompleted(IAsyncResult result) { AsyncDownloadArgs asyncArgs = (AsyncDownloadArgs)result.AsyncState; ConnectionState state = ConnectionState.Success; Exception dlException = null; int size = 0; System.IO.Stream res = null; if (!asyncArgs.TimedOut) { try { using (HttpWebResponse resp = (HttpWebResponse)asyncArgs.WR.EndGetResponse(result)) { using (System.IO.Stream stream = resp.GetResponseStream()) { res = MyHelper.CopyStream(stream); #if !(NETFX_CORE) resp.Close(); #else resp.Dispose(); #endif if (res != null && res.CanSeek) int.TryParse(res.Length.ToString(), out size); } } } catch (WebException ex) { state = ConnectionState.ErrorOccured; if (ex.Status == WebExceptionStatus.RequestCanceled) state = ConnectionState.Canceled; dlException = ex; } catch (Exception ex) { state = ConnectionState.ErrorOccured; dlException = this.GetOrCreateWebException(ex); } } else { state = ConnectionState.Timeout; } this.RemoveDownload(asyncArgs.WR); ConnectionInfo conn = new ConnectionInfo(state, dlException, asyncArgs.Timeout, size, asyncArgs.StartTime, DateTime.UtcNow); StreamResponse strResp = new StreamResponse(conn, res); #if !(NETFX_CORE) System.ComponentModel.AsyncOperationManager.CreateOperation(this).Post(new System.Threading.SendOrPostCallback(delegate(object obj) { object[] arr = (object[])obj; RaiseAsyncDownloadCompleted((StreamResponse)arr[0], arr[1]); }), new object[] { strResp, asyncArgs.UserArgs }); #else RaiseAsyncDownloadCompleted(strResp, asyncArgs.UserArgs); #endif }
protected abstract void RaiseAsyncDownloadCompleted(StreamResponse response, object userArgs);