持久化属性 - 异步

时间:2009-03-09 12:03:18

标签: wcf silverlight asynchronous

在经典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服务。

如何在一种方法中调用服务调用并检索响应?

谢谢, 标记

2 个答案:

答案 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模式和更多绑定。