【问题标题】:interesting service behaviour in silverlightSilverlight 中有趣的服务行为
【发布时间】:2011-02-24 19:45:03
【问题描述】:

我有一个 Silverlight 项目,它通过其服务参考获取一些加密字符串:DataService(在 ASP.NET 项目中完成的服务)。

从 TransactionServices.cs 中获取加密字符串的方法是:

 public void GetEncryptedString(string original)
    {
        DataService.DataServiceClient dataSvc = WebServiceHelper.Create();
        dataSvc.GetEncryptedStringCompleted += new EventHandler<SpendAnalyzer.DataService.GetEncryptedStringCompletedEventArgs>(dataSvc_GetEncryptedStringCompleted);
        dataSvc.GetEncryptedStringAsync(original);
    }

完成后,将结果放入encodedString var(初始化为空值):

void dataSvc_GetEncryptedStringCompleted(object sender, SpendAnalyzer.DataService.GetEncryptedStringCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            try
            {
                if (e.Result == null) return;
                this.encodedString = e.Result;
            }
            catch (Exception ex)
            {
                Logger.Error("TransactionService.cs: dataSvc_GetEncryptedStringCompleted: {0} - {1}",
                    ex.Message, ex.StackTrace);
                MessageBox.Show(ex.ToString());
            }
        }
    }

现在我想从我的 MainPage.xaml 中获取编码字符串,例如:

TransactionService ts = new TransactionService();
                    ts.GetEncryptedString(url);
                    Console.WriteLine(ts.encodedString);

我不明白为什么 ts.encodedString 是空的。当我进行调试时,我看到它实际上打印出空,然后它进入 void dataSvc_GetEncryptedStringCompleted 以获取结果并填充它。

你能指出我做错了什么吗?有没有办法等待编码字符串被提取,然后才继续?

非常感谢。

【问题讨论】:

    标签: asp.net silverlight web-services


    【解决方案1】:

    当您调用ts.GetEncryptedString(url); 时,您刚刚开始了异步操作。因此,您正在访问的值将仅在回调方法中设置。

    但是你在回调修改值之前访问它。

    我使用的解决方案类似于以下内容:

    重新定义 GetEncryptedString 方法签名。

    public void GetEncryptedString(string original, Action callback)
        {
            DataService.DataServiceClient dataSvc = WebServiceHelper.Create();
            dataSvc.GetEncryptedStringCompleted += (o,e) => 
    {
    dataSvc_GetEncryptedStringCompleted(o,e); 
    callback(); 
    }            
            dataSvc.GetEncryptedStringAsync(original);
        }
    

    这样称呼它:

    ts.GetEncryptedString(url, OtherLogicDependantOnResult);

    在哪里

    OtherLogicDependantOnResult 是

    void OtherLogicDependantOnResult()
    {
    //... Code
    }
    

    【讨论】:

    • 有什么办法让它同步吗?我想重定向到它正在加密的 url,那么如何等待回调加载该值?
    • 我一直在寻找解决方案,但后来我就习惯了。无论如何,您可以使此调用同步。看看blog.benday.com/archive/2010/05/15/23277.aspx
    • 非常感谢。看来使用 lambda 表达式是关键!
    猜你喜欢
    • 2011-09-27
    • 2017-02-07
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多