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

客户

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应用程序通过共享的 便携式图书馆.NET4/SL5使用宿主在 ASP.net 4应用程式中使用 ChannelFactory 技术的 游戏 周转基金4服务,包含 IGame异步 CTP的接口

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


编辑2:

  • 在我的 SL5客户端中添加了 Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll
  • 使用 System.Threading.Task;
219510 次浏览

await使用的 GetAwaiter()在 Async 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
}

我遇到这个问题是因为我调用了一个方法

await myClass.myStaticMethod(myString);

但是我把我的字符串设置为

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

结果是 dynamic类型,而不是 string,因此当我试图在 myClass.myStaticMethod(myString)上等待时,编译器认为我想调用 myClass.myStaticMethod(dynamic myString)。这个编译很好,因为,再一次,在动态上下文中,一切都很好,直到它在运行时爆炸,这就是发生了什么,因为没有实现动态版本的 myStaticMethod,这个错误消息没有任何帮助,事实上,智能将带我到正确的定义也没有帮助。< br > 狡猾!

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

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

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

我打给 myStaticMethod的电话路由正确

我在我的一个项目中遇到了这个问题,我发现我已经设置了我的项目的。4.0和异步任务的 Net Framework 版本仅在。Net Framework 4.5及以后版本。

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

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

只是为了清楚-这个包过去被称为 Microsoft.CompilerServices.AsyncTargetingPack和一些旧的 教程仍然参考它。

看看 给你从 Immo Landwerth 获得的信息。

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

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

需要使用 .FirstOrDefaultAsync()而不是00b 错误。

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

你仍然可以使用框架4.0,但你必须包括 getawaiter的类:

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

在我的情况下,只需添加 using System;解决这个问题。

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

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

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

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

如果您正在编写 VisualStudio 扩展(VSIX) ,那么请确保您有一个用于 Microsoft 的 using 语句。VisualStudio.线程:

using Microsoft.VisualStudio.Threading;

我遇到了同样的问题,我必须从方法中删除异步关键字,还要从调用方法中删除 wait 关键字,才能使用 getawait ()而不出现任何错误。

重现这一问题的另一种方式是:

await myvar = myFuncAsync();

不如这样做:

myvar = await myFuncAsync();

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