在WCF方法之后执行方法

时间:2012-04-25 19:51:52

标签: c# wcf silverlight-4.0

我有一个引用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在第一个方法完成之前执行,因此我得到了空引用错误。如何在服务调用完成后确保第二个方法执行? 我希望我明白我的问题。

2 个答案:

答案 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