Dispose of File.Open or StreamContent
本文关键字:or StreamContent Open File of Dispose | 更新日期: 2023-09-27 18:37:07
下面的content.Add
行是否会使对象无法正确处理? 如果是这样,处理此问题的正确方法是什么。
public string UploadGameToWebsite(string filename, string url, string method = null)
{
var client = new HttpClient();
var content = new MultipartFormDataContent();
content.Add(new StreamContent(File.Open(filename, FileMode.Open, FileAccess.Read)), "Game", "Game.txt");
var task = client.PutAsync(url, content);
var result = task.Result.ToString();
return result;
}
- 如果要在方法中调用异步操作,请将方法设置为异步。
- 释放您的文件流以及客户端。在下面的示例中,通过释放
StreamContent
它也释放了底层FileStream
。 - 我更喜欢用于处理多个一次性对象的 finally 块,嵌套
using
语句也完全没问题。 - 不确定为什么要在
HttpResponseMessage
上返回ToString
,也许状态代码会更有用,或者查看 StatusCode = 200 并返回布尔值(真/假)?
法典:
public async Task<string> UploadGameToWebsiteAsync(string filename, string url, string method = null)
{
HttpClient client = null;
StreamContent fileStream = null;
try
{
client = new HttpClient();
fileStream = new StreamContent(System.IO.File.Open(filename, FileMode.Open, FileAccess.Read))
var content = new MultipartFormDataContent();
content.Add(fileStream, "Game", "Game.txt");
HttpResponseMessage result = await client.PutAsync(url, content);
return result.ToString();
}
finally
{
// c# 6 syntax
client?.Dispose();
fileStream?.Dispose(); // StreamContent also disposes the underlying file stream
}
}
使用 using
块的代码版本 #2。
public async Task<string> UploadGameToWebsiteAsync(string filename, string url, string method = null)
{
using (var client = new HttpClient())
{
using (var fileStream = new StreamContent(System.IO.File.Open(filename, FileMode.Open, FileAccess.Read)))
{
var content = new MultipartFormDataContent();
content.Add(fileStream, "Game", "Game.txt");
HttpResponseMessage result = await client.PutAsync(url, content);
return result.ToString();
}
}
}
是的,会的。File.Open 返回应释放的流。最简单的方法是使用"using"块,如下所示:
public string UploadGameToWebsite(string filename, string url, string method = null)
{
var client = new HttpClient();
var content = new MultipartFormDataContent();
using (var fileStream = File.Open(filename, FileMode.Open, FileAccess.Read))
{
content.Add(new StreamContent(fileStream), "Game", "Game.txt");
var task = client.PutAsync(url, content);
var result = task.Result.ToString();
return result;
}
}