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 );

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;
}

Exposition de Service de 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'

<!-- 17 ... c'est mal ?


Edit 1:

Brièvement,

Visual studio 2012 RC Silverlight 5 Application consomme JeuWCF 4 Service hébergé in ASP.net 4 Application avec ChannelFactory technique via Partagé Bibliothèque Portative .NET4 / SL5 contient le iGame interface avec Async CTP

Graphique :

ASP.NET <= Bibliothèque De Classe ( Jeu ) <= Bibliothèque Portable ( iGame ) => Silverlight


Edit 2 :

  • Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll est ajouté dans mon Client SL5
  • utilisation du système . Le filetage . Tâches;
34
demandé sur Ahmed Ghoneim 2012-08-08 00:41:45

7 réponses

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

le problème est donc que les méthodes d'extension ne fonctionnent pas avec dynamic. Ce que vous pouvez faire est de spécifier explicitement que vous travaillez avec un Task, ce qui signifie que la méthode d'extension fonctionnera, et puis revenir à l' 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, depuis le Client() méthode n'est pas réellement pas dynamique, vous pouvez l'appeler avec SerializableDynamicObject, pas dynamic, et ainsi de limiter l'aide de dynamic autant que possible:

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
}
13
répondu svick 2012-08-08 10:44:12

j'ai eu ce problème dans un de mes projets, où j'ai trouvé que j'avais mis mes projets .net la version 4.0 et les tâches async ne sont supportées que dans .net 4.5 sur les paroisses.

j'ai simplement changé les paramètres de mon projet pour utiliser .net 4,5 ou plus et ça a marché.

72
répondu Zapnologica 2016-11-24 06:37:37

Vous devez installer Microsoft.Bcl.Asynchrone package NuGet pour être en mesure d'utiliser