Dans la mesure où j’ai été amené à comprendre afin de produire sync
méthode pour async
:
private async void RefreshScreen()
{
await System.Threading.Tasks.Task.Run(() =>
{
this.refreshContent();
this.refreshTokens();
}
);
}
N’est-il pas là de toute façon pour l’obtenir de façon plus élégante?
MODIFIER
Comme vous pouvez le comprendre RefreshContent()
et RefreshTokens()
sont engagés dans plusieurs appels à un service Web.
Cette implémentation de client Webservice fournit sync
et async
façons d'appeler une méthode:
public async System.Threading.Tasks.Task<string> GetUrlAsync ()
{
ApiResponse<string> localVarResponse = await GetUrlAsyncWithHttpInfo();
return localVarResponse.Data;
}
public string GetUrl ()
{
ApiResponse<string> localVarResponse = GetUrlWithHttpInfo();
return localVarResponse.Data;
}
Actuellement, nous utilisons "sync"
méthodes et certainement, nous voulons passer à l'aide async
appels.
Exemple:
public Enumerable<Element> GatherElements()
{
return yield new Element() {
Field1 = RESTClient.GetMethod1(),
Field2 = RESTClient.GetMethod2(),
Field3 = RESTClient.GetMethod3(),
Field4 = RESTClient.GetMethod4(),
Field5 = RESTClient.GetMethod5(),
Field6 = RESTClient.GetMethod6(),
Field7 = RESTClient.GetMethod7()
};
}
Je ne veux pas attendre que tous les appels restants soient terminés, je veux renvoyer tous les éléments, que chaque Field
est rempli.
Je ne sais pas si j’ai si bien expliqué.
Réponses:
3 pour la réponse № 1Vous "abordez le problème" à l'envers ". Au lieu d'essayer de comprendre comment" rendre cette méthode async ", vous devez commencer par l'autre extrémité.
Par exemple, que fait refreshContent
faire? Effectue-t-il des E / S lentes, par exemple en atteignant une API Web ou une base de données? Ensuite, vous commencez avec ces appels Web / base de données de bas niveau. Rendre ceux-ci asynchrones premier (tous les deux HttpClient
et Entity Framework ont une prise en charge asynchrone intégrée). ensuite await
ces appels, et laissez async
grandir à partir de là.
Le compilateur vous guidera si vous utilisez cette approche, par exemple, il vous recommandera de changer les types de retour en Task
/Task<T>
quand vous ajoutez async
. Comme d’autres l’ont noté, vous devriez éviter async void
. Vous n'aurez également pas besoin d'utiliser Task.Run
sauf si vous effectuez des opérations gourmandes en ressources CPU que vous devez décharger.
Finalement, vous vous retrouverez avec un async Task RefreshScreen
, que vous pouvez appeler depuis un async void
gestionnaire d'événements.