2012-04-25 75 views
0

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

public void StoreNodes() 
{  
    DataServiceClient client = new DataServiceClient(); 
    client.GetNodesForCoreCompleted += client_GetNodesForCoreCompleted; 
    client.GetNodesForCoreAsync(); 
} 

,并呼吁BuildAll()这样的另一种方法:

public void BuildAll() 
{ 
    StoreNodes(); 
    Method2(); 
} 

我的问题是方法2()不是一个WCF服务,并且两个StoreNodes和方法2有一些变量通常,这些变量在StoreNodes中获取它们的值,第二种方法对它们进行一些操作,无论如何,问题是methode2是在第一个方法完成之前执行的,所以我得到了空引用错误。如何确保在服务调用完成后执行第二种方法? 我希望我明确提出了我的问题。

+3

是什么阻止你从client_GetNodesForCoreCompleted调用方法2? – villecoder 2012-04-25 19:58:43

+0

@villecoder,你应该发表你的评论作为答案:) – 2012-04-25 20:12:44

+0

@villecoder:我想过,但它不是重点,谢谢你的时间:) – AboKevo 2012-04-25 20:26:59

回答

0

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

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

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

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

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

另一种方法是,你可以把某种等待的Method2内部的将等待,直到设置适当的变量。但是,这与Silverlight的一般编程范例相反,所以我不会真实地提出它。它会锁定你的用户界面,而你只是等待资源。如果这是你想要什么,然后here is a SO answer on how you could wait for the values

+0

感谢您的回答,我会尝试。 – AboKevo 2012-04-25 20:29:27

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

感谢您的回答,我会试一试。 – AboKevo 2012-04-25 20:28:47