2017-10-25 9 views
2

私は現在、画像をダウンロードするインスタンスメソッドで使用されるHttpClientのインスタンス変数を持っています。このメソッドは常にTask.Run()で呼び出されます。 このメソッドは、1分に何千回も呼び出すことができ、クラッシュしたりエラーを生成したりすることはありません。しかし、もし私がstatic HttpClientに切り替えるとどんな利点があるのか​​知りたかったのですが、おそらくスレッドセーフではありません。あなたがasyncバージョンを使用していないし、あなたが最も可能性の高いデッドロックになってしまいますReadAsByteArrayAsync().Resultを呼び出しているので再利用可能な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(); 
} 
+0

このコードがあるクラスの同じインスタンスで 'DownloadImage'が呼び出されている場合、違いはありません – Jonesopolis

+0

@Jonesopolisそうです。 –

+0

しばしば再利用される静的なHttpClientを作成するのが適切なときは誰にも分かりますか?この記事では、次のように推奨しています。https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ –

答えて

0

:ここ

は、コンテキストのためにいくつかのコードです。

を推奨

最も推奨される方法で、

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

} 

はまたusingブロック意志、例外がスローされた場合Disposeは実行されません、usingブロックを使用し、Disposeを呼び出すことはありません続き例外の場合でも正しくDispose

すべての使い捨て品がusingで包まれていて、async awaitが適切に使用されている限り、HttpClientは単一の静的インスタンスで最高のパフォーマンスを発揮します。

関連する問題