c# wcf silverlight-5.0 async-ctp

c# - Task<> no contiene una definición para ''GetAwaiter''



wcf silverlight-5.0 (7)

Aún puedes usar framework 4.0 pero debes incluir getawaiter para las clases:

MethodName(parameters).ConfigureAwait(false).GetAwaiter().GetResult();

Cliente

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

Contrato

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

Servicio

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

Exponer el servicio desde Silverlight Client

private async void myButton ( object sender , RoutedEventArgs e ) { dynamic Request = new SerializableDynamicObject ( ); Request . Operation = "test"; var task = Client ( Request ); var result = await task; // <------------------------------ Exception }

Excepción

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

¿Qué pasa?

Editar 1:

Brevemente,

Visual Studio 2012 RC Silverlight 5 La aplicación consume Game WCF 4 Service alojado en ASP.net 4 Aplicación con técnica ChannelFactory a través de Shared Portable Library .NET4 / SL5 contiene la interfaz iGame con Async CTP

Grafico :
ASP.NET <= Class Library (Juego) <= Portable Library (iGame) => Silverlight

Editar 2:

  • Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll se agrega en mi cliente SL5
  • usando el sistema. Enhebrado Tareas;

Acabo de experimentar esto en un método que ejecuta una consulta linq.

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

Necesario para usar .FirstOrDefaultAsync() lugar. N00b error.


Debe instalar Microsoft.Bcl.Async paquete Microsoft.Bcl.Async NuGet para poder utilizar construcciones async/await await en las versiones de pre.NET 4.5 (como Silverlight 4.0+)

Solo por claridad: este paquete solía llamarse Microsoft.CompilerServices.AsyncTargetingPack y algunos viejos tutorials aún se refieren a él.

Eche un vistazo here para obtener información de Immo Landwerth.


Tuve este problema en uno de mis proyectos, donde descubrí que había configurado mis proyectos .net versión a 4.0 y tareas asíncronas solo compatibles con .net 4.5 en wards.

Simplemente cambié la configuración de mi proyecto para usar .net 4.5 o superior y funcionó.


Tuve este problema porque estaba llamando a un método

await myClass.myStaticMethod(myString);

pero estaba configurando myString con

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

que resultó en un tipo dynamic , no en una string , así cuando intenté esperar en myClass.myStaticMethod(myString) , el compilador pensó que quería llamar myClass.myStaticMethod(dynamic myString) . Esto compiló bien porque, de nuevo, en un contexto dinámico, todo está bien hasta que explota en el tiempo de ejecución, que es lo que sucedió porque no hay implementación de la versión dinámica de myStaticMethod , y este mensaje de error no ayudó en absoluto, y el hecho de que Intellisense me llevaría a la definición correcta tampoco ayudó.
¡Difícil!

Sin embargo, al forzar el tipo de resultado a la cadena, como:

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

a

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

mi llamada a myStaticMethod enrutada correctamente


GetAwaiter() , que es utilizado por await , se implementa como un método de extensión en el Async CTP. No estoy seguro de qué es exactamente lo que estás usando (mencionas tanto Async CTP como VS 2012 RC en tu pregunta), pero es posible que el paquete de orientación Async use la misma técnica.

El problema entonces es que los métodos de extensión no funcionan con dynamic . Lo que puede hacer es especificar explícitamente que está trabajando con una Task , lo que significa que el método de extensión funcionará, y luego volver a 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 }

O bien, dado que el método Client() no es realmente dinámico, puede llamarlo con SerializableDynamicObject , no dynamic , y limitar el uso dynamic tanto como sea posible:

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 }


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