/ / Utilisez une méthode asynchrone au lieu d’une méthode sync - c #, asynchrone

Utilisez une méthode asynchrone au lieu d’une méthode sync - c #, asynchrone

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 № 1

Vous "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.