2010-03-26 26 views
2

什麼是調用異步框架組件的正確方法 - 等待答案並返回值。 AKA以單一方法包含整個請求/響應。Silverlight方法中的異步操作 - 返回值

示例代碼:

public class Experiment 
    { 
    public Experiment() 
    { 

    } 
     public string GetSomeString() 
     { 
      WebClient wc = new WebClient(); 
      wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted); 
      Uri u = new Uri("http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&topic=t&output=rss"); 
      wc.DownloadStringAsync(u); 
      return "the news RSS from Google"; 
     } 

     private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
     { 

      //don't really see how this callback method makes it able 
      // to return the answer I'm looking for on the return 
      // statement in the method above. 
     } 
    } 

更多信息: 我問這個,我有一個項目,我的工作,我想的JavaScript代碼中使用Silverlight瀏覽器的原因像一個Facade/Proxy到Web服務和複雜的計算操作&。我希望同步調用Silvelight中的[ScriptableMembers]。我不希望Silverlight回調到瀏覽器的JavaScript

回答

1

儘管通過同步調用Web服務器來阻止UI在現代Web應用程序中當然不是典型的,但您應該能夠通過小心使用的ManualResetEvent

基本上,你會引起GetSomeString在您的示例代碼等(WaitOne,最好用超時),而下載的現象發生,並在失敗串完成下載,你會觸發(Set)該事件,以便GetSomeString中的阻塞方法將繼續。你需要把下載的結果放在與調用者相同的地方,並確保它是線程安全的。

1

通常,我從第一個方法傳回一個引用對象。回調方法然後通過保留的引用修改對象。需要注意的是,如果對象具有顯示在屏幕上的屬性,則確保您處於UI線程中。

+0

這種技術的任何在線示例,你可以指點我嗎?或者你可以分享一些示例代碼? – BuddyJoe 2010-04-01 14:14:37