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