任务<>不包含'GetAwaiter'的定义

Ahm*_*eim 51 c# wcf silverlight-5.0 async-ctp

客户

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 );
}
Run Code Online (Sandbox Code Playgroud)

合同

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

    SerializableDynamicObject EndConnection ( IAsyncResult Result );
Run Code Online (Sandbox Code Playgroud)

服务

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;
}
Run Code Online (Sandbox Code Playgroud)

从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
}
Run Code Online (Sandbox Code Playgroud)

例外

Task<SerializableDynamicObject > does not contain a definition for 'GetAwaiter'
Run Code Online (Sandbox Code Playgroud)

怎么了?


编辑1:

简单地说,

的Visual Studio 2012 RC 的Silverlight 5应用程序消耗游戏 WCF服务4在托管ASP.net 4应用通过共享与技术的ChannelFactory 移植库.NET4/SL5包含的iGame与界面异步CTP

图:
ASP.NET <=类库(游戏)<=可移植库(iGame)=> Silverlight


编辑2:

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

Zap*_*ica 90

我在我的一个项目中遇到过这个问题,我发现我已经将项目__CODE__版本设置为4.0,并且只在__CODE__4.5版本的病房中支持异步任务.

我只是将我的项目设置更改为使用__CODE__4.5或更高版本并且它有效.

  • 这对我来说也是一个案例。从 4.0 更改为 4.5 并且有效。 (3认同)

Paw*_*man 38

您必须安装Microsoft.Bcl.Async NuGet包才能使用async/await.NET 4.5之前版本的构造(例如Silverlight 4.0+)

为了清楚起见 - 这个包曾经被调用过,Microsoft.CompilerServices.AsyncTargetingPack而一些旧的教程仍然引用它.

看看这里从IMMO Landwerth信息.


JOp*_*man 23

刚刚在执行linq查询的方法中体验过这一点.

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

需要使用.FirstOrDefaultAsync().N00b错了.

  • 不知道为什么投票,但它对我有用! (3认同)
  • 对我来说是 ToListAsync() 。效果很好。 (3认同)
  • 是的,也对我有用 - FirstOrDefaultAsync 并添加 using Microsoft.EntityFrameworkCore;- 核心2.2项目 (2认同)

svi*_*ick 18

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

那么问题是扩展方法不起作用dynamic.你可以做的是明确指定你正在使用a Task,这意味着扩展方法将起作用,然后切换回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
}
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)