Async JSON Désérialisation
J'ai besoin de faire un RestRequest et obtenir quelques JSON, je ne sais pas si ma méthode est vraiment async puisqu'il y a encore un peu de gel dans mon INTERFACE utilisateur lorsque j'utilise cette méthode.
public async Task<List<MyObject>> Load()
{
var tcs = new TaskCompletionSource<List<Myobject>>();
var client = new RestSharp.RestClient("https://exampleapi.com");
client.Authenticator = OAuth1Authenticator.ForProtectedResource(
[...]);
var request = new RestSharp.RestRequest("examp.json", Method.GET);
client.ExecuteAsync(request, response =>
{
if (response.StatusCode == HttpStatusCode.OK)
{
List_ = new List<MyObject>();
List_ = JsonConvert.DeserializeObject<List<MyObject>>(response.Content);
tcs.SetResult(List_);
}
else
{
MessageBox.Show("Error");
}
});
return await tcs.Task;
}
Spécialement pour cette ligne de code :
List_ = JsonConvert.DeserializeObject<List<MyObject>>(response.Content);
est-il vraiment asynchrone ? parce qu'il semble bloquer l'INTERFACE utilisateur . Pouvez-vous me dire comment puis-je faire de cette fonction correctement asynchrone ?
Vous devez vous connecter pour publier un commentaire.
Il semble que le délégué passé comme argument à
ExecuteAsync
est en cours d'exécution sur le thread d'INTERFACE utilisateur. Si c'est le cas, il suffit d'utiliserTask.Run
pour exécuter le délégué sur le pool de threads au lieu.Est
List_
un champ? Il me semble que ça devrait être une variable locale. Aussi, il n'y a pas besoin de l'initialiser avec une liste vide avant de la désérialisation du json.Thread.Sleep(5000)
et exécuter le code si il bloque l'INTERFACE utilisateur, alors il est en cours d'exécution sur le thread d'INTERFACE utilisateur.JsonConvert.DeserializeObject
est synchrone. Vous pouvez dire par le fait qu'il vous renvoie le résultat de son calcul immédiatement. Il n'y a aucune manière qu'il pourrait faire quelque chose "dans le fond", et plus tard, à la main, vous le résultat.Déplacer CPU de travail liées à un thread du pool de thread à l'aide de
Task.Run
. Vous pouvez bouger le RESTE demande si cela est plus pratique pour vous.Remarque, que votre boîte de message d'appel doit être lancé sur le thread de l'INTERFACE utilisateur. Mieux vaut ne pas créer une boîte de message sur un thread du pool de thread comme vous êtes en train de faire. Ce sera le résultat de deux threads l'INTERFACE utilisateur. La boîte de message ne sera pas modale.