У меня есть асинхронный c метод загрузки для загрузки частичного содержимого с использованием HTTP. Но он бросает System.ObjectDisposedException
куда-то бессмысленно для меня, где конец var response = WebRequest.GetResponse()
using. Потому что я не удаляю никакие объекты вручную, но когда я посмотрел на стек вызовов, я увидел, что кое-что было удалено. В чем причина и как я могу решить эту проблему?
Стек вызовов:
System.dll!Get System.Net.Sockets.NetworkStream.InternalSocket() C#
System.dll!System.Net.PooledStream.CancelPendingIoAndCloseIfSafe(bool closeWithTimeout = {unknown}, int timeout = {unknown}) C#
System.dll!System.Net.PooledStream.CloseSocket() C#
System.dll!System.Net.PooledStream.Dispose(bool disposing = {unknown}) C#
System.dll!System.Net.Connection.Dispose(bool disposing = {unknown}) C#
mscorlib.dll!System.IO.Stream.Close() C#
System.dll!System.Net.Connection.ReadStartNextRequest(System.Net.WebRequest currentRequest = {unknown}, ref System.Net.ConnectionReturnResult returnResult = {unknown}) C#
System.dll!System.Net.ConnectStream.CallDone(System.Net.ConnectionReturnResult returnResult = {unknown}) C#
System.dll!System.Net.ConnectStream.CloseInternal(bool internalCall = {unknown}, bool aborting = {unknown}) C#
System.dll!System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(System.Net.CloseExState closeState = {unknown}) C#
System.dll!System.Net.HttpWebResponse.Close() C#
System.dll!System.Net.WebResponse.Dispose(bool disposing = {unknown}) C#
System.dll!System.Net.HttpWebResponse.Dispose(bool disposing = {unknown}) C#
System.dll!System.Net.WebResponse.Dispose() C#
> MultiThreadDownloadManager.exe!MultiThreadDownloadManager.Downloader.RangeDownloader.AnonymousMethod() C#
RangeDownloader.cs
public void Download()
{
Task.Run(() =>
{
HttpWebRequest request = null;
try
{
lock (GlobalLock.Locker)
{
Status = State.SendRequest;
request = Info != null ?
RequestHelper.CreateHttpRequest(Info, Range.Start, Range.End, BeforeSendingRequest) :
RequestHelper.CreateHttpRequest(Url, BeforeSendingRequest);
Status = State.GetResponse;
}
using (var response = Info != null ?
RequestHelper.GetRangedResponse(Info, Range.Start, Range.End, request, AfterGettingResponse) :
request.GetResponse() as HttpWebResponse)
{
ResponseReceived.Raise(this, new ResponseReceivedEventArgs(response));
using (var fileStream = File.Create(Range.FilePath))
{
Status = State.GetResponseStream;
var str = response.GetResponseStream();
{
var buffer = new byte[2048];
int bytesRead = 0;
while (true)
{
//lock (GlobalLock.Locker)
{
bytesRead = str.Read(buffer, 0, buffer.Length);
if (Info.ContentSize > 0)
bytesRead = (int)Math.Min(Range.Size - Range.TotalBytesReceived, bytesRead);
if (bytesRead <= 0)
break;
if (stopEmergent)
{
break;
}
if (Info != null && Info.ContentSize > 0 && Range.IsDownloaded)
{
break;
}
Range.Status = Status = State.Downloading;
fileStream.Write(buffer, 0, bytesRead);
Range.TotalBytesReceived += bytesRead;
ProgressChanged.Raise(this, EventArgs.Empty);
}
}
}
}
}//System.ObjectDisposedException is here and I don't understand why
if (Info.ContentSize < 1 || Range.IsDownloaded)
{
Range.Status = Status = State.Completed;
Completed.Raise(this, EventArgs.Empty);
}
else if (stopEmergent)
{
Range.Status = Status = State.Stopped;
Stopped.Raise(this, EventArgs.Empty);
}
}
catch (Exception e)
{
if (stopEmergent)
{
Range.Status = Status = State.Stopped;
Stopped.Raise(this, EventArgs.Empty);
}
else
{
Range.Status = Status = State.Failed;
Failed.Raise(this, new ErrorEventArgs(e));
}
}
finally
{
if (request != null)
request.Abort();
}
});
}