-1

私はウェブページをダウンロードするための関数を書きました:次のような関数:

public string GetWebPage(string sURL)
    {
        System.Net.WebResponse objResponse = null;
        System.Net.WebRequest objRequest = null;
        System.IO.StreamReader objStreamReader = null;
        string sResultPage = null;
        try
        {
            objRequest = System.Net.HttpWebRequest.Create(sURL);
            objResponse = objRequest.GetResponse();
            objStreamReader = new System.IO.StreamReader(objResponse.GetResponseStream());
            sResultPage = objStreamReader.ReadToEnd();
            return sResultPage;
        }
        catch (Exception ex)
        {
            return "";
        }
    }

しかし、私の問題はそれです。この機能がその時点で機能していると、アプリケーションはフリーズし(応答ではありません)、そのときは何もできません。どうすればこの問題を解決できますか。時間にダウンロードすると、ユーザーは私のアプリケーションで他のことを行うことができます。

4

2 に答える 2

0

IOをブロックする世界へようこそ。

次のことを考慮してください。

プログラムでWebページをダウンロードしてから、ソースhtmlで見つかった最初の10文字を返すようにします。コードは次のようになります。

...
string page = GetWebPage("http://example.com"); // download web page
page = page.Substring(0, 10);
Console.WriteLine(page);
....

プログラムがGetWebPage()を呼び出す場合、Substring()を呼び出そうとする前に、Webページが完全にダウンロードされるのを待つ必要があります。そうしないと、実際に文字をダウンロードする前に部分文字列を取得しようとする場合があります。

次に、プログラムについて考えてみましょう。あなたはたくさんのコードを持っています-多分GUIインターフェースが実行されています-そしてそれはすべて一度に1行ずつ実行されています。コードがGetWebPage()を呼び出すと、そのリクエストが完全に終了するまで、追加のコードの実行を継続できない可能性があります。プログラム全体がその要求の終了を待っています。

この問題はいくつかの異なる方法で解決できます。最善の解決策は、コードで何をしているかによって異なります。理想的には、コードは非同期で実行する必要があります。c#には、これの多くを処理できるメソッドがありますが、何らかの方法で、作業を開始し、場合によってはWebページをダウンロードしてから、メインスレッドに通知されるまでコードを実行し続けます。 Webページが完全にダウンロードされます。その後、メインスレッドは戻り値の解析を開始できます。

あなたがこの質問をしたので、あなたは一般的にスレッドと並行性に非常に慣れていないと思います。あなたにはやるべきことがたくさんあります。C#での同時実行のスレッド化と実装について読むためのリソースを次に示します。

C#スレッドの紹介

.NET非同期IO設計

于 2012-10-08T05:48:37.367 に答える
0

一番良かったのはスレッドを使うことです

new Thread(download).Start(url);

ダウンロードページのサイズが大きい場合は、チャンクロジックを使用してください。

HttpWebRequest ObjHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(Convert.ToString(url));
                ObjHttpWebRequest.AddRange(99204);
                ObjHttpWebRequest.Timeout = Timeout.Infinite;
                ObjHttpWebRequest.Method = "get";
                HttpWebResponse ObjHttpWebResponse = (HttpWebResponse)ObjHttpWebRequest.GetResponse();
                Stream ObjStream = ObjHttpWebResponse.GetResponseStream();
                StreamReader ObjStreamReader = new StreamReader(ObjStream);
                byte[] buffer = new byte[1224];
                int length = 0;

                while ((length = ObjStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    downloaddata += Encoding.GetEncoding(936).GetString(buffer);
于 2013-09-11T13:31:42.180 に答える