2017-10-25 10 views
2

현재 인스턴스 메서드에서 이미지를 다운로드하는 데 사용되는 HttpClient의 인스턴스 변수가 있습니다. 메서드는 항상 Task.Run()에서 호출됩니다. 이 방법은 1 분에 수천 번 호출 할 수 있으며 충돌이나 오류를 생성하지 않습니다. 하지만 방금 으로 전환하면 어떤 이점이 있는지 알기를 원합니다. 아마도 더 많은 스레드로부터 안전 할 수 있습니다. 여기 재사용 가능한 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

없음

당신이 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 블록을 사용하지 않는, Dispose가 실행되지 않습니다, using 블록 것 제대로 된 경우에도 Dispose.

모든 소모품이 using에 포장되어 있고 async await이 올바르게 사용되는 한 HttpClient은 단일 정적 인스턴스에서 가장 잘 수행됩니다.