System.ObjectDisposedException, несмотря на то, что в NetworkStream.InternalSocket ничего не удалено - PullRequest
0 голосов
/ 06 августа 2020

У меня есть асинхронный 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();
            }
        });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...