Ne peut pas attendre asynchrone de la méthode d'extension
Situation est assez simple: j'ai écrit une méthode d'extension et de fait il asynchrone avec le type de retour Task<T>
. Mais quand j'essaie d'appeler à l'aide de l'attendent, le compilateur génère une erreur qui suggère que la méthode d'extension n'a pas été reconnu asynchrone à tous.
Voici mon code:
public static async Task<NodeReference<T>> CreateWithLabel<T>(this GraphClient client, T source, String label) where T: class
{
var node = client.Create(source);
var url = string.Format(ConfigurationManager.AppSettings[configKey] + "/node/{0}/labels", node.Id);
var serializedLabel = string.Empty;
using (var tempStream = new MemoryStream())
{
new DataContractJsonSerializer(label.GetType()).WriteObject(tempStream, label);
serializedLabel = Encoding.Default.GetString(tempStream.ToArray());
}
var bytes = Encoding.Default.GetBytes(serializedLabel);
using (var webClient = new WebClient())
{
webClient.Headers.Add("Content-Type", "application/json");
webClient.Headers.Add("Accept", "application/json; charset=UTF-8");
await webClient.UploadDataTaskAsync(url, "POST", bytes);
}
return node;
}
var newNode = await client.CreateWithLabel(new Task(), "Task");
Message d'erreur Exact est: est-ce
'Attendre' opérateur ne peut être utilisé dans une méthode asynchrone. Envisager de marquer cette méthode avec la "asynchrone" modificateur et de changer de type de retour à la "Tâche"
Je fais quelque chose de mal ou est-il une langue ou une limitation de compilateur?
Merci de poster le code.
Astuce: si vous suivez les APPUYEZ sur les conventions, d'autres développeurs pourront plus facilement être en mesure d'utiliser votre
Astuce: si vous suivez les APPUYEZ sur les conventions, d'autres développeurs pourront plus facilement être en mesure d'utiliser votre
async
méthodes.OriginalL'auteur chester89 | 2013-11-01
Vous devez vous connecter pour publier un commentaire.
Le message d'erreur est assez clair: la méthode où vous appelez la méthode d'extension doit être marqué comme
async
.Re-lecture de cette partie devrait faire beaucoup plus de sens aujourd'hui:
"La 'attendre' opérateur ne peut être utilisé dans une méthode asynchrone. "
vous pouvez modifier la signature de
MyCallingMethod
retour d'unTask
,void
est seulement bon pour async des gestionnaires d'événements.Je suis en désaccord, il y a beaucoup d'autres scénarios où vous voudriez "fire and forget" comportement. Je vais modifier mon post si, tout simplement parce que les utilisateurs les moins expérimentés pourriez être surpris par les résultats de
async void
.Je suis en désaccord trop qu'il y en a beaucoup. Je serais intéressé d'en apprendre plus sur tout utile scénarios autres que async gestionnaires d'événements (qui n'est évidemment pas le cas ici).
La journalisation, par exemple. Un service d'incendie d'une méthode et de déclencher une logique métier, mais de retour au client dès que possible. Vous n'avez pas toujours besoin d'attendre le résultat d'une méthode. Peut-être que le mot "beaucoup" était un peu trop grande, mais en disant que "nul n'est bon que pour async des gestionnaires d'événement" n'est pas correct non plus.
OriginalL'auteur dcastro