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

Dispose of File.Open or StreamContent

  1. 如果要在方法中调用异步操作,请将方法设置为异步。
  2. 释放您的文件流以及客户端。在下面的示例中,通过释放StreamContent它也释放了底层FileStream
  3. 我更喜欢用于处理多个一次性对象的 finally 块,嵌套using语句也完全没问题。
  4. 不确定为什么要在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;
        }
    }