处理 File.Open 或 StreamContent

Dispose of File.Open or StreamContent

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;
        }

是的,会的。 File.Open returns 应该处理的流。最简单的方法是使用 "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;
        }
    }
  1. 如果要在方法中调用异步操作,请将方法设为异步。
  2. 配置你的文件流和客户端。在下面的例子中,通过处理 StreamContent 它也处理了底层的 FileStream.
  3. 我更喜欢使用 finally 块来处理多个一次性对象,嵌套 using 语句也非常好。
  4. 不确定你为什么 return 在 HttpResponseMessage 上输入 ToString,也许状态代码会更有用,或者查看 StatusCode = 200 和 return 布尔值(true/false)?

代码:

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
    }
}

代码版本 #2 使用 using 个块。

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();
        }
    }
}