Task<>不包含“GetAwaiter”的定义

本文关键字:GetAwaiter 定义 包含 Task | 更新日期: 2024-11-08 08:50:14

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

合同

    [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 客户端公开服务

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 应用程序使用 ASP.net 4 应用程序中托管的游戏 WCF 4 服务与 ChannelFactory 技术通过共享便携式库。NET4/SL5包含带有异步CTPiGame接口

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


编辑 2 :

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

Task<>不包含“GetAwaiter”的定义

我在我的一个项目中遇到了这个问题,我发现我已将项目的 .Net Framework 版本设置为 4.0,并且异步任务仅在 .Net Framework 4.5 及更高版本中受支持。

我只是将我的项目设置更改为使用 .Net Framework 4.5 或更高版本,它就起作用了。

刚刚在执行 linq 查询的方法中体验过这种情况。

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

需要改用.FirstOrDefaultAsync()。N00b 错误。

您必须安装 Microsoft.Bcl.Async NuGet 包才能在 pre-.NET 4.5 版本(如 Silverlight 4.0+)中使用async/await构造

只是为了清楚起见 - 这个包曾经被称为Microsoft.CompilerServices.AsyncTargetingPack,一些旧教程仍然引用它。

请在此处查看Immo Landwerth的信息。

GetAwaiter(),由

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

那么问题是扩展方法不适用于dynamic。您可以做的是显式指定您正在使用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
}

或者,由于 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
}

出现问题 因为我正在使用的应用程序和我添加到应用程序中的 dll 都有不同的版本。

添加此包-安装包 Microsoft.Bcl.Async - 版本 1.0.168

添加此包 异步代码在版本 4.0 中也变得兼容,因为异步仅适用于版本大于或等于 4.5 的应用程序

您仍然可以使用框架 4.0,但您必须为类包含getawaiter

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

确保 .NET 版本 4.5 或更高版本

就我而言,只需添加using System;解决问题。

我遇到了这个问题,因为我正在调用一个方法

await myClass.myStaticMethod(myString);

但我正在设置 myString

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

这导致了dynamic类型,而不是string,因此当我试图等待myClass.myStaticMethod(myString)时,编译器认为我的意思是调用myClass.myStaticMethod(dynamic myString)。 这编译得很好,因为同样,在动态上下文中,一切都很好,直到它在运行时爆炸,这就是发生的事情,因为没有实现动态版本的myStaticMethod,并且此错误消息没有任何帮助,并且 Intellisense 会将我带到正确的定义这一事实也无济于事。
棘手!

但是,通过将结果类型强制为字符串,例如:

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

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

我的呼叫myStaticMethod已正确路由

我遇到了同样的问题,我不得不从方法中删除 async 关键字,并从调用方法中删除 await 关键字以使用 getawaiter() 没有任何错误。

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

如果它使用的是接口,请检查该接口是否也返回 Task<>

如果您正在编写 Visual Studio 扩展 (VSIX),请确保具有 Microsoft.VisualStudio.Threading 的 using 语句,如下所示:

using Microsoft.VisualStudio.Threading;

重现此问题的另一种方法是:

await myvar = myFuncAsync(); 

请改为执行以下操作:

myvar = await myFuncAsync();