web-dev-qa-db-fra.com

La tâche <> ne contient pas de définition pour 'GetAwaiter'

Client

iGame Channel = new ChannelFactory<iGame> ( new BasicHttpBinding ( BasicHttpSecurityMode . None ) , new EndpointAddress ( new Uri ( "http://localhost:58597/Game.svc" ) ) ) . CreateChannel ( );

public Task<SerializableDynamicObject> Client ( SerializableDynamicObject Packet )
{
    return Task<SerializableDynamicObject> . Factory . FromAsync ( Channel . BeginConnection , Channel . EndConnection , Packet , null );
}

Contrat

    [OperationContract ( AsyncPattern = true )]
    IAsyncResult BeginConnection ( SerializableDynamicObject Message , AsyncCallback Callback , object State );

    SerializableDynamicObject EndConnection ( IAsyncResult Result );

Un service

public IAsyncResult BeginConnection ( SerializableDynamicObject Message , AsyncCallback Callback , object State )
{
    dynamic Request = Message;
    dynamic Response = new SerializableDynamicObject ( );
    if ( Request . Operation = "test" )
    {
        Response . Status = true;
    }
    Response . Status = false;

    return new CompletedAsyncResult<SerializableDynamicObject> ( Response );
}

public SerializableDynamicObject EndConnection ( IAsyncResult Result )
{
    return ( Result as CompletedAsyncResult<SerializableDynamicObject> ) . Data;
}

Service exposé du client Silverlight

private async void myButton ( object sender , RoutedEventArgs e )
{
    dynamic Request = new SerializableDynamicObject ( );
    Request . Operation = "test";

    var task = Client ( Request );
    var result = await task;  // <------------------------------ Exception
}

Exception

Task<SerializableDynamicObject > does not contain a definition for 'GetAwaiter'

Qu'est-ce queest faux?


Éditer 1:

Brièvement,

Visual studio 2012 RC Application Silverlight 5consumes Jeu Service WCF 4hébergé dans Application ASP.net 4avec la technique ChannelFactory via Shared Bibliothèque portable .NET4/SL5contient le iGame interface avec Async CTP

Graphique:
ASP.NET <=Bibliothèque de classes (Jeu) <=Bibliothèque portable (iGame) =>/ Silverlight


Edit 2:

  • Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll est ajouté dans mon client SL5
  • using System. Filetage Les tâches;
40
Ahmed Ghoneim

GetAwaiter(), utilisé par await, est implémenté en tant que méthode d'extension dans le CTP Async. Je ne sais pas exactement ce que vous utilisez (vous avez mentionné à la fois Async CTP et VS 2012 RC dans votre question), mais il est possible que le groupe de ciblage Async utilise la même technique.

Le problème est alors que les méthodes d'extension ne fonctionnent pas avec dynamic. Ce que vous pouvez faire est de spécifier explicitement que vous utilisez une Task, ce qui signifie que la méthode d’extension fonctionnera, puis de revenir à dynamic:

private async void MyButtonClick(object sender, RoutedEventArgs e)
{
    dynamic request = new SerializableDynamicObject();
    request.Operation = "test";

    Task<SerializableDynamicObject> task = Client(request);
    dynamic result = await task;

    // use result here
}

Ou bien, puisque la méthode Client() n'est pas réellement dynamique, vous pouvez l'appeler avec SerializableDynamicObject, pas dynamic, et ainsi limiter autant que possible en utilisant dynamic:

private async void MyButtonClick(object sender, RoutedEventArgs e)
{
    var request = new SerializableDynamicObject();
    dynamic dynamicRequest = request;
    dynamicRequest.Operation = "test";

    var task = Client(request);
    dynamic result = await task;

    // use result here
}
14
svick

J'ai eu ce problème dans l'un de mes projets, où j'ai découvert que j'avais défini la version 4.0 de mes projets .net et que les tâches asynchrones ne sont prises en charge que dans .net 4.5.

J'ai simplement changé les paramètres de mon projet pour utiliser .net 4.5 ou supérieur et cela a fonctionné.

80
Zapnologica

Vous devez installer le package Microsoft.Bcl.Async NuGet pour pouvoir utiliser les constructions async/await dans les versions antérieures à .NET 4.5 (telles que Silverlight 4.0+).

Juste pour la clarté - ce paquet s'appelait Microsoft.CompilerServices.AsyncTargetingPack et certains vieux tutoriels s'y réfèrent encore.

Jetez un coup d'oeil ici pour plus d'informations de Immo Landwerth.

30
Pawel Hofman

Je viens de faire l'expérience d'une méthode qui exécute une requête linq.

public async Task<Foo> GetSomething()
{
    return await (from foo in Foos
                  select foo).FirstOrDefault();
}

Nécessaire d'utiliser .FirstOrDefaultAsync() à la place. Erreur N00b.

17
JOpuckman

J'ai eu ce problème parce que j'appelais une méthode

await myClass.myStaticMethod(myString);

mais je mettais myString avec 

var myString = String.Format({some dynamic-type values})

ce qui a abouti à un type dynamic, pas à string, donc lorsque j'ai essayé d'attendre le myClass.myStaticMethod(myString), le compilateur a pensé que je voulais appeler myClass.myStaticMethod(dynamic myString). Ceci est bien compilé parce que, encore une fois, dans un contexte dynamique, tout va bien jusqu'à ce qu'il explose au moment de l'exécution, ce qui est arrivé car il n'y a pas d'implémentation de la version dynamique de myStaticMethod, et ce message d'erreur n'a pas aidé, et le fait qu'Intellisense me conduise à la définition correcte n'a pas aidé non plus.
Rusé!

Cependant, en forçant le type de résultat à string, comme ceci: 

var myString = String.Format({some dynamic-type values})

à 

string myString = String.Format({some dynamic-type values})

mon appel à myStaticMethod routé correctement

1
Sean

Dans mon cas, ajoutez simplement using System; pour résoudre le problème.

0
user632095
public async Task<model> GetSomething(int id)
{
    return await context.model.FindAsync(id);
}
0