Ahm*_*eim 51 c# wcf silverlight-5.0 async-ctp
客户
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 );
}
Run Code Online (Sandbox Code Playgroud)
合同
[OperationContract ( AsyncPattern = true )]
IAsyncResult BeginConnection ( SerializableDynamicObject Message , AsyncCallback Callback , object State );
SerializableDynamicObject EndConnection ( IAsyncResult Result );
Run Code Online (Sandbox Code Playgroud)
服务
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;
}
Run Code Online (Sandbox Code Playgroud)
从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
}
Run Code Online (Sandbox Code Playgroud)
例外
Task<SerializableDynamicObject > does not contain a definition for 'GetAwaiter'
Run Code Online (Sandbox Code Playgroud)
怎么了?
编辑1:
简单地说,
的Visual Studio 2012 RC 的Silverlight 5应用程序消耗游戏 WCF服务4在托管ASP.net 4应用通过共享与技术的ChannelFactory 移植库.NET4/SL5包含的iGame与界面异步CTP
图:
ASP.NET <=类库(游戏)<=可移植库(iGame)=> Silverlight
编辑2:
Zap*_*ica 90
我在我的一个项目中遇到过这个问题,我发现我已经将项目__CODE__版本设置为4.0,并且只在__CODE__4.5版本的病房中支持异步任务.
我只是将我的项目设置更改为使用__CODE__4.5或更高版本并且它有效.
Paw*_*man 38
您必须安装Microsoft.Bcl.Async NuGet包才能使用async/await.NET 4.5之前版本的构造(例如Silverlight 4.0+)
为了清楚起见 - 这个包曾经被调用过,Microsoft.CompilerServices.AsyncTargetingPack而一些旧的教程仍然引用它.
看看这里从IMMO Landwerth信息.
JOp*_*man 23
刚刚在执行linq查询的方法中体验过这一点.
public async Task<Foo> GetSomething()
{
return await (from foo in Foos
select foo).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
需要使用.FirstOrDefaultAsync().N00b错了.
svi*_*ick 18
GetAwaiter(),使用它await,作为Async CTP中的扩展方法实现.我不确定你到底在用什么(在你的问题中你提到了Async CTP和VS 2012 RC),但异步定位包可能使用相同的技术.
那么问题是扩展方法不起作用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
}
Run Code Online (Sandbox Code Playgroud)
或者,由于该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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
113043 次 |
| 最近记录: |