C# 在WCF方法之后执行方法

C# 在WCF方法之后执行方法,c#,wcf,silverlight-4.0,C#,Wcf,Silverlight 4.0,我有一个引用WCF服务的Silverlight类库, 我有一个名为StoreNodes()的方法,它调用WCF服务。 像这样: public void StoreNodes() { DataServiceClient client = new DataServiceClient(); client.GetNodesForCoreCompleted += client_GetNodesForCoreCompleted; client.GetNodesForCoreA

我有一个引用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中获取它们的值,第二个方法对它们执行一些操作,无论如何,问题是method2是在第一个方法完成之前执行的,所以我得到了null引用错误。如何确保在服务调用完成后执行第二个方法??
我希望我把问题说清楚。

有两种方法可以解决这个问题

首先,您可以设置一种类型的异步方法链接。每个方法完成后,将调用下一个方法:

StoreNodes();
|
V
 client_GetNodesForCoreCompleted
  |->Method2();
你可以继续这个

   |
   V
   client_Method2Completed
    |->Method3();
    ....

另一种方法是,您可以在
Method2
中放置某种等待,直到设置了适当的变量。然而,这与Silverlight的一般编程范式背道而驰,因此我不会现实地建议它。它会在您等待资源时锁定您的UI。如果,这是您想要的,那么沿着这些思路应该可以做到:

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();
}

是什么阻止你在client_GetNodesforCore Completed中调用Method2?@villecoder,你应该将你的评论作为答案发布:)@villecoder:我考虑过,但这不是重点,谢谢你的时间:)@AboKevo我不确定你在问什么。您试图在WCF方法完成后调用Method2,对吗?为什么不调用指定在WCF调用完成后执行的方法?@villecoder:我知道你完全正确,而且你的方法100%有效,但出于某种原因,我不想这样做,如果没有其他方法有效,我会按照你说的做,并更改类库的设计:DThanks谢谢你的回答,我会尝试一下。