任务不包含“GetAwaiter"的定义 [英] Task<> does not contain a definition for 'GetAwaiter'

查看:76
本文介绍了任务不包含“GetAwaiter"的定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

客户

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

合同

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

    SerializableDynamicObject EndConnection ( IAsyncResult Result );

服务

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

从 Silverlight 客户端公开服务

Exposing Service from 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
}

异常

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

怎么了?

编辑 1 :

简单地说,

Visual Studio 2012 RC Silverlight 5 应用程序 使用 游戏 WCF 4 服务 托管在 ASP.net 4 应用程序使用 ChannelFactory 技术通过 Shared Portable Library .NET4/SL5 包含带有 Async CTP

Visual studio 2012 RC Silverlight 5 Application consumes Game WCF 4 Service hosted in ASP.net 4 Application with ChannelFactory technique via Shared Portable Library .NET4/SL5 contains the iGame interface with Async CTP

图表:
ASP.NET <= 类库(游戏)<= 便携式库( iGame )=> Silverlight

Graph :
ASP.NET <= Class Library ( Game ) <= Portable Library ( iGame ) => Silverlight

编辑 2 :

  • 在我的 SL5 客户端中添加了 Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll
  • 使用系统.穿线.任务;

推荐答案

GetAwaiter(),由 await 使用,作为 Async 中的扩展方法实现CTP.我不确定您到底在使用什么(您在问题中同时提到了 Async CTP 和 VS 2012 RC),但 Async 目标包可能使用相同的技术.

GetAwaiter(), that is used by await, is implemented as an extension method in the Async CTP. I'm not sure what exactly are you using (you mention both the Async CTP and VS 2012 RC in your question), but it's possible the Async targeting pack uses the same technique.

问题是扩展方法不适用于dynamic.您可以做的是明确指定您正在使用Task,这意味着扩展方法将起作用,然后切换回dynamic:

The problem then is that extension methods don't work with dynamic. What you can do is to explicitly specify that you're working with a Task, which means the extension method will work, and then switch back to 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
}

或者,由于 Client() 方法实际上不是动态的,您可以使用 SerializableDynamicObject 而不是 dynamic 调用它,因此限制尽可能使用dynamic:

Or, since the Client() method is actually not dynamic, you could call it with SerializableDynamicObject, not dynamic, and so limit using dynamic as much as 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
}

这篇关于任务不包含“GetAwaiter"的定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆