我有一个引用WCF服务的Silverlight类库, 我有一个名为StoreNodes()的方法来调用WCF服务。 像这样:
public void StoreNodes()
{
DataServiceClient client = new DataServiceClient();
client.GetNodesForCoreCompleted += client_GetNodesForCoreCompleted;
client.GetNodesForCoreAsync();
}
和另一个名为BuildAll()的方法如下:
public void BuildAll()
{
StoreNodes();
Method2();
}
我的问题是method2()不是WCF服务,并且StoreNodes和Method2都有一些共同的变量,这些变量在StoreNodes中获取它们的值,第二种方法对它们进行一些操作,无论如何,问题是methode2在第一个方法完成之前执行,因此我得到了空引用错误。如何在服务调用完成后确保第二个方法执行? 我希望我明白我的问题。
答案 0 :(得分:2)
这些方面应该有效:
public void BuildAll()
{
StoreNodes(() => { Method2(); });
}
public void StoreNodes(Action getNodesCompleteAction)
{
DataServiceClient client = new DataServiceClient();
client.GetNodesForCoreCompleted += (sender, e) => {
// your handler code
// call Method2() Action wrapper
getNodesCompleteAction();
}
client.GetNodesForCoreAsync();
}
答案 1 :(得分:1)
有两种方法可以解决此问题。
首先,您可以设置一种异步方法链接。每个方法完成后,它会调用下一个方法:
StoreNodes();
|
V
client_GetNodesForCoreCompleted
|->Method2();
而且,你可以继续......
|
V
client_Method2Completed
|->Method3();
....
另一种方式是你可以在Method2
内部进行某种等待,等待设置适当的变量。但是,这违反了Silverlight的一般编程范例,所以我不会现实地提出它。只需等待资源,它就会锁定您的UI。如果,这是你想要的,那么here is a SO answer on how you could wait for the values