Tâche<> ne contient pas une 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;
}
Exposer 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'
Ce's mal ?
Edit 1 :
Brièvement,
Visual studio 2012 RC Silverlight 5 Application consomme Jeu WCF 4 Service hébergé dans ASP.net 4 Application avec ChannelFactory technique via Partagé Bibliothèque Portable .NET4/SL5 contient les 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 SL5 Client
- en utilisant le Système . Le filetage . Tâches;
- Veuillez indiquer la version de C# et inclure l'usage à partir du début du fichier.
- Et si vous êtes à l'aide de la Async CTP, avez-vous fait en sorte d'ajouter une référence à la AsyncCtpLibrary.dll?
- Edit 1
- Edit 2
Vous devez vous connecter pour publier un commentaire.
GetAwaiter()
, qui est utilisé parawait
, est implémenté comme une extension de la méthode dans la Async CTP. Je ne suis pas sûr exactement ce que vous utilisez (vous mentionner à la fois la Async CTP et visual studio 2012 RC dans votre question), mais il est possible que le pack de ciblage Asynchrone utilise la même technique.Le problème est alors que les méthodes d'extension ne fonctionne pas avec les
dynamic
. Ce que vous pouvez faire est de spécifier explicitement que vous travaillez avec unTask
, ce qui signifie que l'extension de la méthode de travail, et puis revenir àdynamic
:Ou, depuis le
Client()
méthode n'est pas réellement pas dynamique, vous pouvez l'appeler avecSerializableDynamicObject
, pasdynamic
, et ainsi de limiter l'usage desdynamic
autant que possible:J'ai eu ce problème dans un de mes projets, où j'ai trouvé que j'avais mis mes projets
.net
version 4.0 et async tâches sont prises en charge uniquement dans.net
4.5 sur les paroisses.J'ai simplement changé mes paramètres de projet pour utiliser
.net
4.5 ou au-dessus et cela a fonctionné.Vous devez installer Microsoft.Bcl.Async package NuGet pour être en mesure d'utiliser
async/await
des constructions dans les pre-.NET 4.5 versions (comme Silverlight 4.0+)Juste pour la clarté - ce paquet utilisé pour être appelé
Microsoft.CompilerServices.AsyncTargetingPack
et de quelques vieux tutoriels toujours vous y référer.Prendre un coup d'oeil ici pour info Immo Landwerth.
Vécu et ce dans une méthode qui exécute une requête linq.
Nécessaires à l'utilisation de
.FirstOrDefaultAsync()
à la place. N00b erreur.Vous pouvez toujours utiliser framework 4.0, mais vous devez inclure
getawaiter
pour les classes:MethodName(parameters).ConfigureAwait(false).GetAwaiter().GetResult();
Assurez-vous que votre .NET version 4.5 ou plus
J'ai eu ce problème parce que j'étais l'appel d'une méthode
mais j'ai été la mise myString avec
qui a entraîné une
dynamic
type, pas unstring
, donc quand j'ai essayé d'attendre surmyClass.myStaticMethod(myString)
, le compilateur pensé que je voulais appelermyClass.myStaticMethod(dynamic myString)
. Cette compilé bien parce que, de nouveau, dans un contexte dynamique, c'est du tout bon jusqu'à ce qu'il explose au moment de l'exécution, qui est ce qui s'est passé, car il n'y a pas de mise en œuvre de la version dynamique demyStaticMethod
, et ce message d'erreur n'a pas aidé que ce soit, et le fait que cette fonctionnalité va me prendre pour la définition exacte n'a pas aider non plus.Délicat!
Cependant, en forçant le type de résultat à la chaîne, comme:
à
mon appel à
myStaticMethod
acheminé correctementDans mon cas, ajoutez simplement
using System;
résoudre le problème.