可重用的 HttpClient 实例与静态变量(在多个线程中大量使用)?

Jim*_*hey 6 c# static asynchronous httpclient task

我目前有一个 a 的实例变量HttpClient,在实例方法中使用它来下载图像。该方法始终在 a 中调用Task.Run()。该方法可以在一分钟内被调用数千次,并且不会崩溃或产生任何错误。但我只是想知道,除了static HttpClient可能更加线程安全之外,如果我切换到 a 还会有什么好处(如果有的话)。

这是上下文的一些代码:

HttpClient client = new HttpClient(); // Make this static?

// Always called in a Task.Run(() => DownloadImage(Obj));
public async void DownloadImage(Object obj)
{
    FormUrlEncodedContent formContent = GetFormContent(Obj);
    HttpResponseMessage Result = await client.PostAsync("URL", formContent).ConfigureAwait(false);
    byte[] Data = Result.Content.ReadAsByteArrayAsync().Result;
    StaticClass.Images[Obj.ID] = ImageSource.FromStream(() => new MemoryStream(Data));
    formContent.Dispose();
    Result.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

Aka*_*ava 2

由于您没有使用async版本并且正在调用,因此ReadAsByteArrayAsync().Result很可能会陷入死锁。

受到推崇的

以下是最推荐的方式,

static HttpClient client = new HttpClient ();

public async Task DownloadImage(Object obj)
{
    using(FormUrlEncodedContent formContent = GetFormContent(Obj)) {
       using(HttpResponseMessage Result = await 
           client.PostAsync("URL", formContent)
           .ConfigureAwait(false)){
              byte[] Data = await Result.Content.ReadAsByteArrayAsync();
              StaticClass.Images[Obj.ID] = ImageSource.FromStream(
                   () => new MemoryStream(Data));
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

也不要调用Dispose,使用usingblock,Dispose如果抛出异常则不会执行,即使出现异常usingblock也会正常执行。Dispose

只要所有一次性物品都被包裹起来usingasync await正确使用,HttpClient在单个静态实例中将表现最佳。