Silverlight中有趣的服务行为

时间:2011-02-24 19:45:04

标签: asp.net silverlight web-services

我有一个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以获取结果并填充它。

你能指出我做错了什么吗?有没有办法等待fetString被提取,只有在那之后继续?

非常感谢。

1 个答案:

答案 0 :(得分:0)

当您致电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
}