在经典ASP.NET中,我将持久保存从基类属性中的Web服务中提取的数据,如下所示:
private string m_stringData;
public string _stringData
{ get {
if (m_stringData==null)
{
//fetch data from my web service
m_stringData = ws.FetchData()
}
return m_stringData;
}
}
这样我就可以简单地引用 _stringData 并知道我总是得到我以后的数据(有时候我会使用Session状态作为存储而不是私有成员变量)。
在带有WCF的Silverlight中,我可能会选择使用独立存储作为我的持久性机制,但不能像这样进行服务调用,因为必须异步调用WCF服务。
如何在一种方法中调用服务调用并检索响应?
谢谢, 标记
答案 0 :(得分:0)
在您的方法中,异步调用服务调用并注册设置标志的回调。调用该方法后,请输入busy / wait循环,定期检查该标志,直到设置标志指示已返回数据。回调应该为您的方法设置后备字段,一旦检测到标志已设置为表示成功,您应该能够立即返回该字段。你还需要关注失败。如果可以从不同的线程多次调用您的方法,您还需要使用一些锁定来使代码线程安全。
修改强>
实际上,如果Web服务支持BeginGetData / EndGetData语义,那么繁忙/等待循环可能不是可行的方法。我看了一些我的代码,我做了类似的事情,我使用WaitOne只是等待异步结果,然后检索它。如果你的web服务不支持这个,那么在你的等待循环中抛出一个Thread.Sleep - 比如说50-100ms - 给其他进程执行时间。
我的代码示例:
IAsyncResult asyncResult = null;
try
{
asyncResult = _webService.BeginGetData( searchCriteria, null, null );
if (asyncResult.AsyncWaitHandle.WaitOne( _timeOut, false ))
{
result = _webService.EndGetData( asyncResult );
}
}
catch (WebException e)
{
...log the error, clean up...
}
答案 1 :(得分:0)
感谢您的帮助tvanfosson。我按照你的代码,也找到了一个伪类似的解决方案,完全使用lambda表达式来满足我的需求:
private string m_stringData;
public string _stringData{
get
{
//if we don't have a list of departments, fetch from WCF
if (m_stringData == null)
{
StringServiceClient client = new StringServiceClient();
client.GetStringCompleted +=
(sender, e) =>
{
m_stringData = e.Result;
};
client.GetStringAsync();
}
return m_stringData;
}
}
修改强>
哎呀......实际上这也不起作用:-( 我最终异步调用并改变我的编程逻辑以使用MVVM模式和更多绑定。