0

ねえ、私はC#とHtmlAgilityPackの両方を学び始めています。これまでのところ、私は小さなテストプロジェクトに取り組んでいます。私が抱えている問題の1つは、ファイルが2回ダウンロードされないように、ファイルがすでに存在するかどうかを確認することです。

もう1つの問題は、Webサイトをスクレイピングしたり、画像をダウンロードしたりしているときに、プログラム全体が一定期間フリーズしてから再び機能するようになることですが、これを回避する方法はありますか?

if (!File.Exists(@"Res\" + pokeName + ".jpg"))
        {
            var item = doc.DocumentNode.SelectNodes("//a[@class='image']//img")[0];
            if (doc.DocumentNode.SelectNodes("//a[@class='image']//img") != null)
            {
                getImage(item.GetAttributeValue("src", ""));
                pictureBox1.Load(@"Res\" + pokeName + ".jpg");
            }
        }
        else
        {
            pictureBox1.Load(@"Res\" + pokeName + ".jpg");
        }

public void getImage(string url){

        string imageUrl = @""+ url;
        string saveLocation = @"Res\"+ pokeName + ".jpg";

        byte[] imageBytes;
        HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(imageUrl);
        WebResponse imageResponse = imageRequest.GetResponse();

        Stream responseStream = imageResponse.GetResponseStream();

        using (BinaryReader br = new BinaryReader(responseStream ))
        {
            imageBytes = br.ReadBytes(500000);
            br.Close();
        }
        responseStream.Close();
        imageResponse.Close();

        FileStream fs = new FileStream(saveLocation, FileMode.Create);
        BinaryWriter bw = new BinaryWriter(fs);
        try
        {
            bw.Write(imageBytes);
        }
        finally
        {
            fs.Close();
            bw.Close();
        }
    }

どんな助けでも大歓迎です:)

4

1 に答える 1

0

UIスレッドに長時間実行されているアイテムがあるため、プログラムがフリーズしている可能性があります。

前述のようにバックグラウンドワーカーを使用するか、(。Net 4.5を使用している場合)新しいasync/awaitシステムを使用することを検討することをお勧めします。

GetStreamAsyncは、このような状況に非常に最適です。繰り返し取得するのではなく、長時間待機したり、大量のアイテムを処理したりする可能性がある場合は、 http://msdn.microsoft.com/en-gb/library/vstudio/hh551738.aspx

また、補足として、3つの画像{1.jpg、2.jpg、foo / 1.jpg}がある場合に入力したコードは、名前が最初の画像と一致しているため、3番目の画像を取得できません。また、たくさんあります。 jpeg/jpgよりも多くの画像拡張:)

于 2013-03-24T02:10:29.533 に答える