2016-04-01 33 views
0

Göndermemin adı için özür dilerim ama sorunumu açıklamaya çalışacağım.Dış bir API'ye bağlanmak için güvenli bir iş parçacıklı istemci kitaplığı oluşturun

Harici bir API istemek için istemci kitaplığı oluşturuyorum ve kitaplığımın yöntemlerini güvenli bir şekilde nasıl işleyeceğimi bulmaya çalışıyorum.

Temelde benim kütüphanenin ana sınıfı aşağıdaki gibidir:

public class MyCompanyApiClient 
{ 
    private readonly HttpClient _httpClient; 

    public MyCompanyApiClient(string baseUrl) 
    { 
     _httpClient = new HttpClient() {BaseAddress = new Uri(baseUrl)}; 
     _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    } 

    public async Task<MyClassB> PostData(int id, MyClassA dataToPost) 
    { 
     var request = new HttpRequestMessage(HttpMethod.Post, $"objects/{id}"); 
     request.Content = new StringContent(JsonConvert.SerializeObject(dataToPost), Encoding.UTF8, 
      "application/json"); 

     var response = await _httpClient.SendAsync(request); 
     response.EnsureSuccessStatusCode(); 

     var stringContent = await response.Content.ReadAsStringAsync(); 
     return JsonConvert.DeserializeObject<MyClassB>(stringContent); 
    } 

    public async Task<MyClassA > GetById(int id) 
    { 
     ... 
    } 
} 
Ben müvekkilimin sınıfının herhangi örnek üyenin, güvenli iş parçacıklı olmasını sağlamak istiyorum

. Şu an için

Ben Task.Run içine her yöntem içinde kod kaydırmak için plan:

public async Task<MyClassB> PostData(int id, MyClassA dataToPost) 
{ 
    return await Task.Run(async() => 
    { 
     var request = new HttpRequestMessage(HttpMethod.Post, $"objects/{id}"); 
     request.Content = new StringContent(JsonConvert.SerializeObject(dataToPost), Encoding.UTF8, 
      "application/json"); 

     var response = await _httpClient.SendAsync(request); 
     var stringContent = await response.Content.ReadAsStringAsync(); 
     return JsonConvert.DeserializeObject<MyClassB>(stringContent); 
    }); 
} 

güvenli iş parçacıklı olmak için bu yöntemi sağlamak için gidiyor onu bile bilmiyorum arada.

Herhangi bir yardım çoklu iş parçacığı anlamına gelmez ^^

+1

Hiç bir iş parçacığı sorunu yok gibi görünüyor. Ne çözmeye çalışıyorsun? –

+0

Bu sınıf, bir eventhub'dan yüksek miktarda ileti işleyen bir masmavi bir ağa dönüştürülecek ve ben güvenli iş parçacığı hakkında herhangi bir sorunum olmayacağından emin olmak istiyorum, ancak ben bu sorunun üstesinden gelinebilir miyim. – Thomas

+0

@Thomas * iş parçacığı güvenli *, değil * güvenli iş parçacığı * –

cevap

2

Konu güvenli aprreciated.

Bu, bazı kodların çok iş parçacıklı durumlarda kullanılacağının farkında olduğunu ve bozuk olmayacaklarını, kilitlenmeyecek ve diğer iş parçacığıyla ilgili sorunlar üretmeyeceklerini ifade eder.

Bazen parçacığı güvenli kod var başına, bazen parçacığı eşitleme monitörleri gibi yaklaşımları kullanmak gerekir iken, muteksler birer çalıştırılmak üzere kritik kod bölümlerini korumak için, etkinlikler, semaforlar ve diğerlerini sıfırlama iki kez veya n iş parçacığı, bir kez daha, deadlocks, bozulmaları ve temelde beklenmedik davranışları önlemek için.

Sizin durumunuzda, iş parçacığı güvenli iş parçacığı havuzundaki bir iş parçacığı olarak PostData başlatılıyor gibi görünüyor. Bu kötü bir seçim, bunun için yeni bir konuya ihtiyacınız yok.

+0

Bu açıklama için teşekkürler Matias. Ben soruyu kapatacağım ^^ – Thomas

+0

@Thomas Soruyu kapatarak ne demek istiyorsun? : D Cevabım işe yaradıysa, çözüm olarak işaretleyebilirsiniz. –

+0

Evet, ama şu an bunu yapamam, beklemem lazım ^^ – Thomas