0

特定のサイトの HTML を取得する必要がある Windows 8 用のアプリをコーディングしています。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()別の関数を持つ理由は、コンストラクター内asyncawait使用できないためです。

于 2013-01-13T23:29:29.667 に答える