【问题标题】:Task<> does not contain a definition for 'GetAwaiter'Task<> 不包含“GetAwaiter”的定义
【发布时间】:2012-08-04 22:20:49
【问题描述】:

客户

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 应用程序 使用 游戏 WCF 4 服务 托管在 ASP.net 4 应用程序通过共享 Portable Library .NET4/SL5 使用 ChannelFactory 技术包含带有 Async CTP

iGame 接口

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


编辑 2:

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

【问题讨论】:

  • 请说明 C# 版本并包含文件顶部的用法。
  • 如果您使用的是 Async CTP,您是否确定要添加对 AsyncCtpLibrary.dll 的引用?

标签: c# wcf silverlight-5.0 async-ctp


【解决方案1】:

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

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

【讨论】:

  • 这对我来说也是一个案例。从 4.0 更改为 4.5,它工作正常。
  • 或者安装Microsoft.Bcl.Async nuget包以保持在4.0
【解决方案2】:

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

为了清楚起见 - 这个包曾经被称为 Microsoft.CompilerServices.AsyncTargetingPack 并且一些旧的 tutorials 仍然引用它。

查看 here 以获取来自 Immo Landwerth 的信息。

【讨论】:

  • 谢谢你 - 我使用的服务器是 4.0,我无法升级到 4.5
【解决方案3】:

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

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

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

【讨论】:

  • 对我来说是 ToListAsync() 。效果很好。
  • 是的也对我有用 - FirstOrDefaultAsync 并添加一个 using Microsoft.EntityFrameworkCore; - 核心 2.2 项目
【解决方案4】:

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

那么问题是扩展方法不适用于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
}

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      添加这个包- 安装包 Microsoft.Bcl.Async -Version 1.0.168

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

      【讨论】:

        【解决方案7】:

        确保您的 .NET 版本为 4.5 或更高版本

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 同样,我正在使用 UWP,只是缺少使用 System;打电话。
          【解决方案9】:

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

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

          我对@9​​87654330@ 的呼叫路由正确

          【讨论】:

            【解决方案10】:
            public async Task<model> GetSomething(int id)
            {
                return await context.model.FindAsync(id);
            }
            

            【讨论】:

            • 请在您的代码中添加说明,解释为什么您的代码应该帮助他
            【解决方案11】:

            我遇到了同样的问题,我必须从方法中删除 async 关键字,并从调用方法中删除 await 关键字才能使用 getawaiter() 而不会出现任何错误。

            【讨论】:

              【解决方案12】:

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

              using Microsoft.VisualStudio.Threading;
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-04-20
                • 2017-11-20
                • 2018-08-21
                • 2016-12-15
                • 2017-04-08
                • 1970-01-01
                • 2023-01-09
                • 2020-08-21
                相关资源
                最近更新 更多