Ich benutze restsharp.portable 3.1.3 in meiner nativen Xamarin-Anwendung. Normalerweise werden alle meine Anfragen von einer RestClient-Instanz gesendet. Das liegt daran, dass das Erstellen und Ablegen von HttpClient schwere Operationen für mobile Anwendungen sind. Manchmal habe ich einige Fälle, wenn meine Anwendung mehrere Anfragen parallel senden sollte.Restsharp portable parallele Anfragen werden nacheinander von einer Instanz von RestClient gesendet
Zum Beispiel:
private async void button2_Click(object sender, EventArgs e)
{
var maxTaskCount = 3;
var client = new RestClient("http://jsonplaceholder.typicode.com/");
var tasks = new List<Task<IRestResponse>>();
for (var i = 0; i < maxTaskCount; i++)
{
var request = new RestRequest("photos");
request.Method = Method.GET;
var task = client.Execute(request);
tasks.Add(task);
}
var result = await Task.WhenAll(tasks);
}
Während ich meine App Profilierungs mit Proxy (Fiddler oder Charles) fand ich innerhalb restsharp.portable Bibliothek etwas Engpass heraus. Die Anfragen werden nacheinander gesendet. Der Rest Sharp-Paket hat AsyncLock Klasse mit LockAsync Methode für die Synchronisierung aller Anfragen, die von einer Instanz von RestClient gesendet werden.
/// <summary>
/// Execute the given request
/// </summary>
/// <param name="request">Request to execute</param>
/// <returns>Response returned</returns>
public override async Task<IRestResponse> Execute(IRestRequest request)
{
using (await _requestGuard.LockAsync(CancellationToken.None))
{
using (var response = await ExecuteRequest(request, CancellationToken.None))
{
return await RestResponse.CreateResponse(this, request, response);
}
}
}
Deshalb habe ich das Leistungsproblem gehabt haben, die durch die Schaffung von eigenen RestClient Instanz für alle Anfragen gelöst wurde, die parallel gesendet werden soll.
Ich habe keine Ahnung, warum die author von RestSharp Portable entschieden, AsyncLock in seinem Paket zu verwenden. Vielleicht, weil der RestClient darin einen Zustand hält.
Bellow sind die Ergebnisse meiner Forschung:
- Eine RestClient Instanz und drei API-Aufrufe. Wie wir sehen können, sind alle 3 Anrufe aufeinander folgend.
- Drei RestClient-Instanzen und drei API-Aufrufe (ein Aufruf für eine RestClient-Instanz). Wie wir sehen können, sind alle drei Anrufe parallel.
Nur FYI: [RestSharp] (https://components.xamarin.com/view/restharp/) unterstützt parallele Anfragen, weil es auf HttpWebRequest/HttpWebResponse basiert. – ZEvS