2011-03-23 34 views
1

我想將非常靜態的DownloadString()調用轉換爲DownloadStringAsync(),但無法按需要獲取流。將DownloadString WebClient()單線程調用遷移到異步調用

目前,我做了在很多地方如下:

string apiurl = "http://api.gowalla.com/spots/" + spot; 
var entries = JsonConvert.DeserializeObject<SpotInfo>(CallGowalla(apiurl)); 
return entries; 

隨着CallGowalla看起來像這樣:

private static string CallGowalla(string apiurl) 
     { 
      var wc = new WebClient(); 
      wc.Headers["Accept"] = "application/json"; 
      wc.Headers["ContentType"] = "application/json"; 
      wc.Headers["Authorization"] = CreateAuthorizationString(); 
      wc.Headers["-Gowalla-API-Key"] = ConfigurationManager.AppSettings["api"].ToString(); 
      var raw = wc.DownloadString(apiurl); 
      return raw; 
     } 

我的叫聲越來越掛斷,所以我想要將DownloadString移動到DownloadStringAsync,我不知道從哪裏開始,而不是全部拆開CallGowalla的所有呼叫。

任何想法?建築與重構歡迎也

建議...

+0

這是一個贏得應用程序或網絡應用程序? – 2011-03-24 01:08:30

+0

爲什麼不把這些調用移動到後臺線程?你確定你想要異步呼叫嗎? – BrokenGlass 2011-03-24 02:12:13

回答

1

你可能需要考慮一下你是如何調用CallGowalla()方法。以異步方式開始調用此方法可能更容易。查看this Microsoft知識庫文章中的一些示例。在這些示例中,您的CallGowalla()方法等同於LongRunningMethod()。

異步運行方法(可能使用其他線程)在ASP.NET等某些環境中可能會出現問題。研究依賴於您的環境的問題非常重要。如果您試圖獲得更高的吞吐量(更多呼叫Gowalla),那麼您可能需要考慮使用ThreadPool來執行您的方法而不管理線程。問題在於您可能會很快超出Gowalla API限制。如果你可以提供更多關於你爲什麼需要異步調用這些調用的細節,那將是一件好事。

如果您需要C#線程的良好概述,那麼可以使用free book

+0

感謝您的迴應。異步調用的主要原因是因爲我的應用程序有時會在其線程中鎖定,而它正在等待Gowalla的響應。我曾考慮過使用單獨的線程來做到這一點 - 但我不確定哪種方法是最佳做法。將看看你提供的微軟知識庫文章... +1 – dooburt 2011-03-24 20:32:10

+0

微軟知識庫文章是一個救星,讓我知道我需要什麼。 '免費書'也是信息的金礦。非常感謝。 – dooburt 2011-03-25 10:12:29