1

我有一个引用 WCF 服务的 Silverlight 类库,我有一个调用 WCF 服务的名为 StoreNodes() 的方法。像这样:

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 执行在第一种方法完成之前,所以我得到了空引用错误。如何确保服务调用完成后执行第二种方法?我希望我把我的问题说清楚了。

4

2 回答 2

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();
}
于 2012-04-25T20:16:51.040 回答
1

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

首先,您可以设置一种异步方法链接。在每个方法完成后,它会调用下一个:

StoreNodes();
|
V
 client_GetNodesForCoreCompleted
  |->Method2();

而且,你可以继续这个......

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

另一种方法是您可以在其中放置某种等待Method2,直到设置了适当的变量。但是,这与 Silverlight 的一般编程范式背道而驰,因此我不会现实地建议它。它会在您等待资源时锁定您的 UI。如果,这就是你想要的,那么这里有一个关于如何等待值的答案

于 2012-04-25T20:13:14.623 回答