我有一个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被提取,只有在那之后继续?非常感谢。
答案 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
}