2011-04-06 89 views
2

有沒有方法A完成之前調用methodB,以便methodB被執行?香港專業教育學院試圖實現它的多種方式,其中沒有工作:(是否可以編輯以下代碼,以便執行第二種方法?


能有人解釋?謝謝。

public List<ObjectA> _OurObjectA= new List<ObjectA>(); 

public List<ObjectA> methodA() 
{ 

    List<ObjectA> products = new List<ObjectA>(); 
    ServiceReference1.ServiceClient client = 
     new ServiceReference1.ServiceClient(); 
    client.getProductCompleted += 
     new EventHandler<ServiceReference1.getProductCompletedEventArgs>(methodB); 

    client.getProductAsync(); 

    return _OurObjectA; 
} 

void methodB(object sender, ServiceReference1.getProductCompletedEventArgs e) 
{ 
    ObservableCollection<ServiceReference1.ObjectA> products = e.Result; 
    foreach (ServiceReference1.ObjectA obj in products) 
    { 
     ObjectA temp = new ObjectA(obj); 
     _OurObjectA.Add(temp); 
    } 
} 

回答

1

它分配方法methodB作爲事件getProductCompleted。當一個事件處理程序該事件由所述client變量凸起,該事件處理程序被執行

UPDATE:
更新我的回答居然回答你的問題...
您可以使用此代碼,從methodA返回產品已被退回後:

public List<ObjectA> methodA() 
{ 
    var products = new List<ObjectA>(); 
    var mre = new ManualResetEvent(false); 
    var client = new ServiceReference1.ServiceClient(); 
    client.getProductCompleted += (s, e) => { 
               try 
               { 
                products.AddRange(
                 e.Result.Select(o => 
                  new ObjectA(o))); 
               } 
               finally 
               { 
                mre.Set(); 
               } 
              }; 

    client.getProductAsync(); 
    mre.WaitOne(); 

    return products; 
} 

你甚至不需要的methodB在這種情況下。代碼假定,您至少使用.NET 3.5。

+0

感謝您編輯我的代碼:)所以我想如果methodA被調用,那麼它會自動調用methodB?但不知何故,它不被稱爲。無論如何將這兩種方法結合(1種方法)?謝謝:) – RKM 2011-04-06 13:56:02

+0

只有在事件引發時纔會調用methodB。正如Giovanni解釋的那樣,在webservice完成其工作之後,會發生這種情況。這可能會在methodA完成執行後很長時間發生。 – 2011-04-06 13:57:42

+0

哦......謝謝。無論如何解決這個問題?因爲我想在方法A完成時返回ObjectA的列表:) – RKM 2011-04-06 14:06:14

6

它看起來像methodA調用一個Web服務。當Web服務完成時,它調用methodB。令人困惑的部分是,這是asynchronous(通過事件處理程序)... methodA立即返回;它不必等待Web服務完成。

這可能是因爲服務需要很長時間(相對來說),所以在這種情況下,您可以立即從methodA返回,做一些其他的工作,並且當web服務完成時,methodB可以做到這些從Web服務返回的數據。這是更有效地利用資源。有時候,這種事情是這樣完成的,以至於UI看起來不像是「掛起來」。

+0

非常感謝。是的,這是一個帶WCF服務的Silverlight應用程序。當我運行這段代碼時,MethodB似乎永遠不會被執行,它只是跳過這部分,然後瀏覽器出現錯誤,並且整個應用程序,我猜這是因爲它是異步的?無論如何解決這個問題?謝謝:) – RKM 2011-04-06 14:01:31

0

而且很顯然有一個錯誤的methodB:

foreach (ServiceReference1.ObjectA obj in products) 
    { 
     ObjectAtemp = new ObjectA(obj); 
     // no temp -- there should be a space between ObjectA and temp in the line above 
     // perhaps just a typo here on SO? or in the original code? 
     // EDIT: I see the code in methodB has now been corrected. 
     _OurObjectA.Add(temp); 
    } 
+0

感謝您的發現。這是從我複製代碼。 :) – RKM 2011-04-06 14:02:14

1

你的客戶對象有一個名爲getProductCompleted的event。當該事件發佈時,methodB被執行。 client.getProductAsync()是一個異步調用,這意味着即使該方法將立即返回,它將開始在後臺下載產品。產品下載完成後,客戶端發佈該事件,導致執行方法B.

+0

謝謝!我意識到methodB只在服務完成後才被調用,到時候它已經太晚了,瀏覽器已經完成加載信息。 :( – RKM 2011-04-06 15:01:47

相關問題