0

ここに私の方法があります:

private static void UpdatePref(List<EmailPrefer> prefList)
{
    if(prefList.Count > 0)
    {
        foreach (EmailPref pref in prefList)
        {
            UpdateEmailRequest updateRequest = new UpdateEmailRequest(pref.ID.ToString(), pref.Email, pref.ListID.ToString());
            UpdateEmailResponse updateResponse =(UpdateEmailResponse) updateRequest.SendRequest();

            if (updateResponse.Success)
            {
                Console.WriteLine(String.Format("Update Succsesful.  ListID:{0}  Email:{2}  ID:{1}", pref.ListID, pref.Email, pref.ID));
                continue;
            }
            Console.WriteLine( String.Format("Update Unsuccessful.  ListID:{0}  Email:{2}  ID:{1}\n", pref.ListID, pref.Email, pref.ID));
            Console.WriteLine(String.Format("Error:{0}", updateResponse.ErrorMessage));
        }

        Console.WriteLine("Updates Complete.");
    }
    Console.WriteLine("Procses ended.  No records found to update");
}

リストには約 84 個の有効なレコードがあり、ループして API リクエストを送信しています。しかし、3 回目の API 呼び出しで停止し、84 レコードのうち 2 つしか処理しません。何が起こっているのかを確認するためにデバッグすると、エラーが吐き出されることなく、SendRequest メソッドでここで停止することがわかります。GetRequestStream で停止し、そこに移動してステップを続けようとすると、停止し、アプリケーションはエラーなしで実行を停止します!

HttpWebRequest request = CreateWebRequest(requestURI, data.Length);
request.ContentLength = data.Length;
request.KeepAlive = false;
request.Timeout = 30000;

// Send the Request
requestStream = request.GetRequestStream();

なんだ?最終的に実行し続けると、「操作がタイムアウトしました」というエラーが表示されます。しかし、なぜ最初の 2 つの呼び出しは成功し、この呼び出しはタイムアウトになったのでしょうか? 理解できません。

また、2つ目の質問です。送受信のために foreach 内に新しいオブジェクトを作成するのは非効率的ですか? しかし、それが私がこれらのクラスをスタブ化し、そのタイプの API 呼び出しを送信するための要件として電子メール、ListID などを要求した方法です。foreach の反復ごとに新しいインスタンスを作成することが適切かどうか、または効率的でないかどうかはわかりませんでした。一般的かもしれませんが、私には奇妙で非効率的だと感じました。

4

2 に答える 2

1

編集:あなたはすでにコメントであなた自身の質問に答えたようです。

私はこれについて個人的な経験はありませんが、応答を取得した後、HTTPWeb要求でcloseを呼び出す必要があるようです。開いている接続の数には2つの制限があり、Close()を実行するまで接続は解放されません。http://blogs.msdn.com/feroze_daud/archive/2004/01/21/61400.aspxを参照してください。これにより、表示されている症状を示す次のコードが提供されます。

    for(int i=0; i < 3; i++) {
       HttpWebRequest r = WebRequest.Create(“http://www.microsoft.com“) as HttpWebRequest;
       HttpWebResponse w = r.GetResponse() as HttpWebResponse;
    }
于 2009-03-23T04:17:03.297 に答える
0

タイムアウトする可能性の1つは、話しているサーバーがスロットルしていることです。更新のたびに遅延(1秒、多分?)を挿入してみてください。

とがそれぞれとから何らかの形で派生していると仮定するUpdateEmailRequestと、要求を実行する方法で作成することは特に非効率的ではありません。それはかなり標準的です。ただし、これは、管理されていないリソースを割り当てる可能性があることを意味することに注意してください。メソッドを呼び出すことによって、それを破棄する必要があります。このようなもの:UpdateEmailResponseWebRequestWebResponseWebResponseIDisposableDispose

UpdateEmailResponse updateResponse =(UpdateEmailResponse) updateRequest.SendRequest();
try
{
    if (updateResponse.Success)
    {
        Console.WriteLine(String.Format("Update Succsesful.  ListID:{0}  Email:{2}  ID:{1}", pref.ListID, pref.Email, pref.ID));
        continue;
    }
    Console.WriteLine( String.Format("Update Unsuccessful.  ListID:{0}  Email:{2}  ID:{1}\n", pref.ListID, pref.Email, pref.ID));
    Console.WriteLine(String.Format("Error:{0}", updateResponse.ErrorMessage));
}
finally
{
    updateResponse.Dispose();
}

応答オブジェクトを破棄しないとサーバーへの接続が開いたままになる可能性があり、開いている接続が多すぎるためにサーバーがタイムアウトしている可能性があります。

于 2009-03-23T04:01:37.813 に答える