2013-01-13 21 views
0

我正在爲Windows 8編寫一個應用程序,它需要獲取特定站點的HTML。當我將它編入MainPage中的按鈕事件時,它運行良好。然而,當我試圖做它在我的課「樂隊」:使用await阻礙程序的進程

 public Band(String Name) 
    { 
     this.Name = Name; 
     GetHtmlDocument(); 
     GenerateId(); 
     GetAlbumDocument(); 
     GenerateLogo(); 
     GeneratePhoto(); 
     CreateAlbumList(); 
    } 

    private async void GetHtmlDocument() 
    { 
     HttpClientHandler handler = new HttpClientHandler(); 
     HttpClient client = new HttpClient(handler as HttpMessageHandler) { BaseAddress = new Uri(@"http://www.metal-archives.com/bands/" + Name) }; 
     var r = await client.GetAsync(client.BaseAddress); 
     string html = null; 
     if (r.IsSuccessStatusCode) html = await r.Content.ReadAsStringAsync(); 
     HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument(); 
     document.LoadHtml(html); 
     DocumentBand = document; 
    } 

它來到

var r = await client.GetAsync(client.BaseAddress); 

線,然後從GenerateId()方法進行,因爲它是在構造函數中。但爲了處理GenerateId()方法,必須完成GetHtmlDocument()方法。我應該在這種情況下做什麼?

我的主要語言是Java,我對C#很陌生,所以可能會出現巨大的編碼或命名錯誤。

回答

0

我會做這樣的事情:

public Band(String Name) 
    { 
     this.Name = Name; 
    } 

    public async Task Init() 
    { 
     await GetHtmlDocument(); 
     GenerateId(); 
     GetAlbumDocument(); 
     GenerateLogo(); 
     GeneratePhoto(); 
     CreateAlbumList(); 
    } 

    // Note Task Return type 
    private async Task GetHtmlDocument() 
    { 
     HttpClientHandler handler = new HttpClientHandler(); 
     HttpClient client = new HttpClient(handler as HttpMessageHandler) { BaseAddress = new Uri(@"http://www.metal-archives.com/bands/" + Name) }; 
     var r = await client.GetAsync(client.BaseAddress); 
     string html = null; 
     if (r.IsSuccessStatusCode) html = await r.Content.ReadAsStringAsync(); 
     HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument(); 
     document.LoadHtml(html); 
     DocumentBand = document; 
    } 

從你的代碼,你就必須單獨調用初始化:

Band band = new Band("name"); 
await band.Init(); 

的原因有單獨Init()功能是因爲asyncawait不能在構造函數中使用。

2

雖然你的GetHtmlDocument函數有一個異步簽名,但它並沒有調用該簽名。

您在函數中調用client.GetAsync()。這將控制權返回到調用函數,在這種情況下是Band的構造者,而不用等待結果。

更改呼叫

應該帶的東西同步。

+0

我做了你所說的; 'var r = await GetHtmlDocument();',但現在它給出了另一個錯誤** Explore_a_Metal_Band.Band.GetHtmlDocument()不返回任務,不能等待。考慮改變它返回Task。**。你能詳細說明一下嗎? –

+0

這將不起作用,因爲對'GetHtmlDocument'的調用在構造函數中。那裏(在構造函數中)不支持'async'關鍵字,這意味着'await'不能在那裏使用。 –

+0

'await'不能在構造函數中使用,所以它不起作用。我錯了嗎?你能詳細說明一下嗎? –