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)
不
由于您没有使用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
只要所有一次性物品都被包裹起来using并async await正确使用,HttpClient在单个静态实例中将表现最佳。