2015-12-25 50 views
1

我已經成功地將json數據拖入使用visual studio 2015中的控制檯應用程序的字符串中。現在我試圖複製此wpf,但我發現我無法使用.GetResponse()和我必須使用GetResponseAsync()來代替。谷歌搜索了一段時間後,我認爲我明白異步/等待的重點,但我似乎陷入了僵局。所以這裏是我當前的代碼:當使用await時出現死鎖GetResponseAsync()

這是異步方法,它從Web API拉取返回數據並返回一個JSON字符串。或者在這種情況下,Task<String>

public async static Task<String> GetTrola(string station) 
     { 
      var url = "http://www.trola.si/" + station; 

      string text; 

      HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
      request.Accept = "application/json"; 

      var answer = (HttpWebResponse)(await request.GetResponseAsync()); 

      using (var sr = new StreamReader(answer.GetResponseStream())) 
      { 
       text = sr.ReadToEnd(); 
      } 
      return text; 
     } 

然後我稱之爲一個按鈕單擊事件的功能,像這樣:

string station = textBox.Text.ToString(); 
string output = GetJson.Trola.GetTrola(station).Result; 
var myObject = JsonConvert.DeserializeObject<Result>(output); 

但我認爲問題是,尤其在該行的GetData功能:

var answer = (HttpWebResponse)(await request.GetResponseAsync()); 

我不知道爲什麼會發生這種情況,因爲我在等待await關鍵字的請求。我錯過了什麼?

回答

4

在這一行

string output = GetJson.Trola.GetTrola(station).Result; 

你阻塞UI線程。需要在await之後運行的部分GetData相同的線程。僵局。

您應該使用await得到結果

string output = await GetJson.Trola.GetTrola(station); 

你可以找到Stephen Cleary's blog一個非常詳細的解釋。

+0

那麼我正在嘗試,但我想我誤解/誤解了錯誤。由於我在無效的button_click方法中調用方法.getTrola,因此無法在其中使用await運算符。所以我應該寫一個新的異步方法,並在button_clicked方法中調用它,對吧? – mythic

+2

@mythic使事件處理程序「異步無效」。然後你可以在裏面使用'await'。通常'async'方法應該返回一個'Task',但是在事件處理程序中可以使用'async void'。 –

0

我可以參考this代碼和存儲庫,例如那正是你想要的。

public async Task<TranslateResult> Find(TranslateRequest translateRequest) 
{ 
    if (!configuration.IsAppropriateForTranslation(TranslatorType)) 
     return new TranslateResult(false, new Maybe<string>()); 

    var address = configuration.TurengUrl; 
    var uri = new Uri(address + translateRequest.CurrentText); 

    var turenClient = new WebClient(); 
    turenClient.Encoding = Encoding.UTF8; 
    turenClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36"); 
    turenClient.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8,tr;q=0.6"); 
    turenClient.CachePolicy = new HttpRequestCachePolicy(HttpCacheAgeControl.MaxAge, TimeSpan.FromHours(1)); 

    var compositeMean = await turenClient.DownloadStringTaskAsync(uri); 
    var organizer = meanOrganizerFactory.GetMeanOrganizers().First(x => x.TranslatorType == TranslatorType.TURENG); 
    var mean = await organizer.OrganizeMean(compositeMean); 

    return new TranslateResult(true, mean); 
} 
相關問題