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包含带有异步CTP的iGame接口
图:
ASP.NET <= 类库 ( 游戏 ) <= 便携式库 ( iGame ) => Silverlight
编辑 2 :
- Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll 已添加到我的 SL5 客户端中
- 使用系统 。线程。任务;
我在我的一个项目中遇到了这个问题,我发现我已将项目的 .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();