客户端
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 包含 iGame 界面与异步CTP
图表
ASP.NET &lt; = 类库(游戏)&lt; = 可移植库(iGame) =&gt; Silverlight
编辑2:
答案 0 :(得分:86)
我在我的一个项目中遇到过这个问题,我发现我已将项目.net
版本设置为4.0,并且仅在病房.net
4.5中支持异步任务。
我只是将我的项目设置更改为使用.net
4.5或更高版本,但它确实有效。
答案 1 :(得分:33)
您必须安装Microsoft.Bcl.Async NuGet包才能在.NET 4.5之前的版本中使用async/await
构造(例如Silverlight 4.0 +)
为了清楚起见 - 以前这个包被称为Microsoft.CompilerServices.AsyncTargetingPack
,而一些旧的tutorials仍然引用它。
查看来自Immo Landwerth的信息here。
答案 2 :(得分:18)
在执行linq查询的方法中遇到过这种情况。
public async Task<Foo> GetSomething()
{
return await (from foo in Foos
select foo).FirstOrDefault();
}
需要使用.FirstOrDefaultAsync()
代替。 N00b错误。
答案 3 :(得分:15)
GetAwaiter()
使用的 await
是作为Async CTP中的扩展方法实现的。我不确定你到底在用什么(在你的问题中你提到了Async 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
}
答案 4 :(得分:3)
您仍然可以使用框架4.0,但是必须为类添加getawaiter
:
MethodName(parameters).ConfigureAwait(false).GetAwaiter().GetResult();
答案 5 :(得分:2)
确保您的.NET 4.5或更高版本
答案 6 :(得分:1)
我遇到了这个问题因为我正在调用方法
await myClass.myStaticMethod(myString);
但是我用
设置了myStringvar 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
的呼叫正确路由
答案 7 :(得分:1)
就我而言,只需添加=IF(OR(LEFT(SUBSTITUTE(A1," ",""),1)=" ",RIGHT(SUBSTITUTE(A1," ",""),1)=" "),TRUE,FALSE)
即可解决问题。
答案 8 :(得分:0)
public async Task<model> GetSomething(int id)
{
return await context.model.FindAsync(id);
}
答案 9 :(得分:0)
出现问题是因为我正在使用的应用程序和我添加到我的应用程序中的dll都具有不同的版本。
添加此软件包- 安装软件包Microsoft.Bcl.Async-版本1.0.168
添加此程序包异步代码也将在4.0版中兼容,因为异步仅适用于版本大于或等于4.5的应用程序
答案 10 :(得分:0)
我遇到了同样的问题,我必须从方法中删除 async 关键字,并从调用方法中删除 await 关键字才能使用 getawaiter() 没有任何错误。
答案 11 :(得分:-1)
以防万一,错误消息:
如果在这样的变量之前未正确地放置等待,也会发生'不包含'GetAwaiter'等的定义。
:
代替:
RtfAsTextLines = await OpenNoUserInterface(FilePath);
答案 12 :(得分:-1)
如果您正在编写 Visual Studio 扩展 (VSIX),请确保您有 Microsoft.VisualStudio.Threading 的 using 语句,如下所示:
using Microsoft.VisualStudio.Threading;