C# &引用;在写入所有字节之前无法关闭流";当WriteAsync操作被取消时

C# &引用;在写入所有字节之前无法关闭流";当WriteAsync操作被取消时,c#,asynchronous,stream,async-await,httprequest,C#,Asynchronous,Stream,Async Await,Httprequest,在对由HttpWebRequest.GetRequestStream()创建的流取消WriteAsync操作时,我会收到一个WebException,并显示以下消息: 在写入所有字节之前无法关闭流 当我使用CancellationToken取消操作时,如何清理我的HttpWebRequest和我的流 这是我工作代码的一部分(我清理了这篇文章的一些标题,因此请求的格式可能不正确): public async Task UploadAsync(FileInfo-fi,CancellationToke

在对由
HttpWebRequest.GetRequestStream()创建的流取消
WriteAsync
操作时,我会收到一个WebException,并显示以下消息:

在写入所有字节之前无法关闭流

当我使用
CancellationToken
取消操作时,如何清理我的
HttpWebRequest
和我的流

这是我工作代码的一部分(我清理了这篇文章的一些标题,因此请求的格式可能不正确):

public async Task UploadAsync(FileInfo-fi,CancellationToken-ct,IProgress-progress=null)
{
FileStream fs=newfilestream(fi.FullName,FileMode.Open);
int bufferSize=1*1024*1024;
字节[]缓冲区=新字节[bufferSize];
内伦;
长位置=fs位置;
长totalWrittenBytes=0;
HttpWebRequest uploadRequest=null;
Stream putStream=null;
尝试
{
而((len=fs.Read(buffer,0,buffer.Length))>0)
{
uploadRequest=(HttpWebRequest)WebRequest.Create(“http://myuploadUrl");
uploadRequest.Method=“PUT”;
uploadRequest.AddRange(位置,位置+len-1);
uploadRequest.ContentLength=len;
putStream=uploadRequest.GetRequestStream();
int posi=0;
int字节左=len;
整数块大小;
while(字节左>0)
{
chunkSize=Math.Min(25*1024,字节左);//25KB
//这是要取消的WriteAsync部分
wait putStream.WriteAsync(缓冲区、posi、块大小、ct);
bytesLeft-=块大小;
posi+=chunkSize;
totalWrittenBytes+=chunkSize;
如果(进度!=null)
进度报告((int)(totalWrittenBytes*100/fs.Length));
}
putStream.Close();
putStream=null;
位置=fs.位置;
var putResponse=(HttpWebResponse)uploadRequest.GetResponse();
putResponse.Close();
uploadRequest=null;
}
//写入(缓冲区,0,len);
}
捕捉(操作取消例外)
{ 
if(putStream!=null)
{
putStream.Flush();
putStream.Close();//此处发生WebException:在写入所有字节之前无法关闭流。
}    
返回false;
}
最后{
fs.Close();
}
返回true;
}

我终于捕获了
WebException
,因为post请求必须写入预期的字节数(
ContentLength
属性)

这是我最后的收获

        catch (OperationCanceledException ex)
        {
            try
            {
                if (putStream != null)
                    putStream.Dispose();
            }
            catch (WebException) { }
            return false;
        }
        finally{
            fs.Close();
        }
也许我不确定我是否应该费心处理这条小溪

        catch (OperationCanceledException ex)
        {
            try
            {
                if (putStream != null)
                    putStream.Dispose();
            }
            catch (WebException) { }
            return false;
        }
        finally{
            fs.Close();
        }