2016-04-01 5 views
0

Entschuldigung für den Namen meines Posts, aber ich werde versuchen, mein Problem zu erklären.Erstellen Sie eine Client-Bibliothek mit sicherem Threading, um eine Verbindung mit einer externen API herzustellen

Ich baue eine Client-Bibliothek, um eine externe API anzufordern, und ich versuche herauszufinden, wie die Methoden meiner Bibliothek Safe-Threading gemacht werden.

Grundsätzlich ist die Hauptklasse von meiner Bibliothek sieht wie folgt aus:

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) 
    { 
     ... 
    } 
} 

Ich mag würde, um sicherzustellen, dass alle Instanz Mitglieder meiner Client-Klasse sind sicher Thread.

Im Moment plane ich den Code in jeder Methode in eine Task.Run zu wickeln:

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

Durch die Art, wie ich weiß nicht einmal, ob es diese Methode wird, um eine sichere Thread zu sein.

Jede Hilfe aprreciated ^^

+1

Es scheint überhaupt kein Threading-Problem zu geben. Was versuchst du zu lösen? –

+0

Diese Klasse wird in einem azurblauen Webjob verwendet, der eine große Menge an Nachrichten von einem Eventhub verarbeitet, und ich möchte sicherstellen, dass ich kein Problem mit Safe-Threading habe, aber ich überlege das Problem. – Thomas

+0

@Thomas Es ist * thread-safe *, nicht * safe-thread * –

Antwort

2

Thema sicher bedeutet nicht Multi-Threading.

Es bedeutet, dass einige Code bewusst ist, dass es in Multithread-Fällen verwendet wird, und sie werden nicht beschädigt werden nicht zu Deadlocks und anderen Threading-Problemen führen.

Manchmal gibt es Code, es ist Thread-sicher per se, während manchmal müssen Sie Thread-Synchronisation wie Monitore Ansätze verwenden, Mutexe, Reset Ereignisse, Semaphore und andere, kritische Codeabschnitte zu schützen, von einer ausgeführt wird, zwei oder n Threads gleichzeitig, um wiederum Deadlocks, Korruption und im Grunde, unerwartete Verhaltensweisen zu vermeiden.

In Ihrem Fall scheint es, als ob Sie in Betracht ziehen thread-safe Starten Sie Ihre PostData als Thread im Thread-Pool. Dies ist eine schlechte Wahl, Sie brauchen dafür keinen neuen Thread.

+0

Danke Matias für diese Erklärung. Ich werde die Frage schließen ^^ – Thomas

+0

@Thomas Was meinst du mit dem Schließen der Frage? : D Wenn meine Antwort nützlich war, können Sie sie als Ihre Lösung markieren. –

+0

Ja sicher, aber ich kann es jetzt nicht tun, ich muss warten ^^ – Thomas

Verwandte Themen