2012-04-25 49 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