web-dev-qa-db-fra.com

ne contient pas de définition pour 'GetAwaiter'

Je reçois l'erreur ci-dessous avec l'ensemble de code ci-dessous. Il commet une erreur sur la ligne 'alliancelookup', je ne suis pas sûr de ce que je fais mal mais je ne pouvais rien voir moi-même. La question que je me pose en courant semble bien fonctionner, mais il semble que le problème que je me pose soit avec le Awaiter. Je me demandais s’il existait un moyen de contourner ce problème?

DynamicCrest crest = new DynamicCrest();
var root = await crest.GetAsync(crest.Host);
var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
allianceid = alliancelookup.id;

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Dynamic.ExpandoObject' ne contient pas de définition pour 'GetAwaiter' sur CallSite.Target (Closure, CallSite, Object) sur System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0, TRet] (site CallSite, T0 arg0) dans ***. Programme. <> c. <b__2_10> d.MoveNext () dans C:\Utilisateurs ---\Documents\Visual Studio 2015\Projets ------\Program.cs: ligne 95

5
Kristen Tidmuss

Il n'est pas possible de savoir exactement ce qui ne va pas sans un exemple minimal, complet et vérifiable , mais il semblerait que vous êtes awaiting quelque chose qui n'est pas censé être awaited.

Fractionnement de la ligne alliancelookup:

// Asynchronously retrieve the alliances.
var alliances = await root.GetAsync(r => r.alliances);

// Synchronously get the first matching one.
var allianceLookup = alliances.First(i => i.shortName == e.GetArg("allianceticker").ToUpper());

Il peut y avoir une meilleure approche, en déplaçant le filtre dans le code asynchrone, mais cela dépend de DynamicCrest.

6
Stephen Cleary

Vous avez une attente de plus que ce dont vous avez besoin. Vous devez seulement attendre les méthodes asynchrones, mais vous attendez également le résultat, dont le type apparemment déclaré est dynamic. C'est pourquoi vous ne recevez pas d'erreur de compilation.

Avec dynamic, il essaiera de lier la méthode nécessaire à l'exécution. Lorsque vous utilisez async, cette méthode est .GetAwaiter (), une exception RuntimeBinderException "ne contient pas de définition pour 'GetAwaiter'"

Cela dit, la troisième ligne devrait être:

var alliancelookup = (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());

Bien que la séparation proposée par Stephen Cleary soit une meilleure pratique.

1
fbiagi

Vous attendez un appel asynchrone, vous devez donc placer la tâche async au début de la méthode où vous appelez ce code

public async Task<returntyp> Name()
{
  DynamicCrest crest = new DynamicCrest();
  var root = await crest.GetAsync(crest.Host);
  var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
  allianceid = alliancelookup.id;
0
Mostafiz