完成对WCF服务的异步调用后,我希望将成功消息设置为session并向用户显示通知。
我尝试使用两种方法来完成此操作。
1)基于事件的模型。
client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(GetDataCompleted);
client.GetDataAsync(id, client);
private void GetDataCompleted(object obj, GetDataCompletedEventArgs e)
{
this.SetNotification(new Notification() { Message = e.Result, Type = NotificationType.Success });
}
在MyOperationCompleted事件中,我可以设置HttpContext.Current.Session的通知,但我必须等待此操作完成,并且无法导航到其他页面。
2)IAsyncResult模型。 通过这种方式我可以导航到其他页面并对wcf服务进行异步调用,但是在GetDataCallback方法中无法设置通知,因为session = null。
client.BeginGetData(id, GetDataCallback, client); private void GetDataCallback(IAsyncResult ar) { string name = ((ServiceReference1.Service1Client)ar.AsyncState).EndGetData(ar); this.SetNotification(new Notification() { Message = name, Type = NotificationType.Success }); }
在启用服务引用时“生成异步操作”。
请帮助我解决这个问题。感谢。
答案 0 :(得分:0)
我不是wcf专家,但我发现工作的是将您的调用包装在ThreadPool.QueueUserWorkItem中的方法的Async版本中。没有这个,我有同样的阻塞问题。所以这似乎释放了你的asp mvc中的主线程继续前进,而另一个工作线程等待回调。
另外,我使用了AsyncController,虽然没有工作线程就没有这个。
请参阅:http://msdn.microsoft.com/en-us/library/ee728598.aspx
我用它作为指南,但仍然需要ThreadPool。
干杯