3

C#、.Net4.5。処理されるオブジェクトを含むキューがあります。処理には、オブジェクトのフィールドの1つで指定されたURLを使用してデータを取得することが含まれます。操作の過程で、新しいオブジェクトをキューに追加できます。ネットワークを非同期にして作業を行おうとすると、問題が発生しました。

これが最小コードです。

public partial class Form1 : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        string[] urls = { "http://www.stackoverflow.com/", 
                            "http://www.google.com/", 
                            "http://www.microsoft.com/" };
        int i = 0;
        Queue<MyClass1> queue = new Queue<MyClass1>();

        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(urls[i]);
        webRequest.Proxy.Credentials = CredentialCache.DefaultCredentials;
        queue.Enqueue(new MyClass1(urls[i], webRequest.GetResponseAsync()));

        while (queue.Count > 0)
        {
            MyClass1 o = queue.Dequeue();
            o.RespTask.Wait();
            Debug.Print("Url: {0}, bytes: {1}", o.Url, 
                o.RespTask.Result.ContentLength);

            i++;
            if (i < urls.Length)
            {
                webRequest = (HttpWebRequest)WebRequest.Create(urls[i]);
                webRequest.Proxy.Credentials = CredentialCache.DefaultCredentials;
                queue.Enqueue(new MyClass1(urls[i], webRequest.GetResponseAsync()));
            }
        } 
    }
}

public class MyClass1
{
    public MyClass1() { }
    public MyClass1(string url, Task<WebResponse> respTask)
    {
        Url = url;
        RespTask = respTask;
    }

    public string Url;
    public Task<WebResponse> RespTask;
}

そのコードはo.RespTask.Wait()でハングします。サイクルの3回目の反復。この呼び出しの前に、o.RespTask.Statusの値はWaitingForActivationであり、待機は永久に続きます。私は何が間違っているのですか?

アップデート。3つのボックスのコードをチェックしました。それらのうちの2つ(Win732ビットおよびWin764ビット)では、プログラムがハングします。3番目(Win7 64ビット)では、すべてが正常に機能しています。それは私には非常に奇妙に思えます。

4

1 に答える 1

2

このような変更の後、このコードはハングしなくなりました。

...
Debug.Print("Url: {0}, bytes: {1}", o.Url, 
    o.RespTask.Result.ContentLength);

o.RespTask.Result.Close();

i++;
...

私の間違いは、HttpWebResponseクラスのCloseメソッドの呼び出しが必須であるという事実に注意を払わなかったことです。

于 2012-11-08T11:41:57.333 に答える