gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:42:21 30 4
gpt4 key购买 nike

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

这里是上下文的一些代码:

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

最佳答案

由于您没有使用 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));
}
}

}

也不要调用Dispose,使用using block ,如果抛出异常,Dispose不会执行,using block 将正确 Dispose 即使在异常情况下也是如此。

只要所有可释放对象都包含在 using 中并且 async await 使用得当,HttpClient 将在单个静态实例中表现最佳。

关于c# - 可重用的 HttpClient 实例与静态变量(在多线程中大量使用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46939959/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com