0

我正在编写一个适用于 Windows 8 的应用程序,该应用程序需要获取特定站点的 HTML。当我将它编码到 MainPage 中的按钮事件中时,它运行良好。但是,当我尝试在我的班级“乐队”中这样做时:

        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# 还很陌生,因此可能存在巨大的编码或命名错误。

4

2 回答 2

2

尽管您的函数 GetHtmlDocument 具有异步签名,但并未针对该签名调用它。

您在函数中调用 client.GetAsync()。这会将控制权交还给调用函数,在这种情况下是 Band 的构造函数,而无需等待结果。

将呼叫更改为

await GetHtmlDocument()

应该使事情同步。

于 2013-01-13T22:49:09.343 回答
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;
    }

从您的代码中,您必须单独调用 init :

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

有一个单独的Init()函数的原因是因为async并且await不能在构造函数内部使用。

于 2013-01-13T23:29:29.667 回答