75

客户

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

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


编辑 2:

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

12 回答 12

116

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

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

于 2015-09-09T09:20:24.480 回答
51

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

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

在这里查看来自 Immo Landwerth 的信息。

于 2016-09-23T13:46:06.203 回答
46

刚刚在执行 linq 查询的方法中经历了这一点。

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

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

于 2017-07-05T17:41:56.697 回答
22

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

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

或者,由于该Client()方法实际上不是动态的,因此您可以使用SerializableDynamicObject、 not调用它,并尽可能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
}
于 2012-08-07T21:30:22.997 回答
4

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

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

于 2018-08-03T18:28:12.650 回答
4

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

添加此 Package-Install-Package Microsoft.Bcl.Async -Version 1.0.168

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

于 2019-11-26T06:17:51.553 回答
3

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

于 2019-03-14T12:07:43.700 回答
2

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

于 2018-12-11T03:14:12.390 回答
1

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

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路由正确

于 2015-08-05T20:14:43.517 回答
1
public async Task<model> GetSomething(int id)
{
    return await context.model.FindAsync(id);
}
于 2017-08-22T11:56:37.873 回答
0

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

于 2021-01-18T01:44:36.550 回答
-1

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

using Microsoft.VisualStudio.Threading;
于 2020-12-22T22:14:54.093 回答