处理File.Open或StreamContent

Mik*_*ynn 3 .net c# dispose

下面的行是否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;
        }
Run Code Online (Sandbox Code Playgroud)

Igo*_*gor 6

  1. 如果要在方法中调用异步操作,请使方法异步.
  2. 处理您的文件流以及客户端.在下面的例子中,通过处理StreamContent它也处理底层FileStream.
  3. 我更喜欢使用finally块来处理多个一次性对象,它也可以完美地嵌套using语句.
  4. 不知道为什么要退回ToStringHttpResponseMessage,也许状态代码会更加有用或看的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
    }
}
Run Code Online (Sandbox Code Playgroud)

代码版本#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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)