2015年1月22日木曜日

HttpWebResponseオブジェクトを使ってループすると、無応答になってしまった現象について (IDispose)

リソース確保したら、解放しましょう。という備忘録です。

複数のサーバーにあるサービスのHTTPステータスを監視したいと思い、
表をループで処理する仕組みを作っていました。

未試験ですが、ざっと以下のようなコードです。

実装時、無応答になることがあったので、もしやと思い、Disposeのコードを追加。

さらっと、流れました。

確か、HTTPだと同時通信数が決まってましたよね。
IDisposeインターフェースを持つオブジェクトは、終わったらきちんと破棄しようと思いました。



    System.Data.DataTable dt;
    if (this.dataGridView1.DataSource != null)
    {
        dt = (System.Data.DataTable)this.dataGridView1.DataSource;

        foreach (DataRow dr in dt.Rows)
        {
            HttpWebResponse res = null;
            try
            {
                res = null;
                req = WebRequest.Create(new Uri(dr["LOGIN_URL"].ToString())) as HttpWebRequest;
                res = (HttpWebResponse)req.GetResponse();
                dr["STATUS"] = res.StatusCode.ToString();
                res.Dispose();
            }
            catch (WebException ex)
            {
                //HTTPプロトコルエラーかどうか調べる
                if (ex.Status == System.Net.WebExceptionStatus.ProtocolError)
                {
                    System.Net.HttpWebResponse errres = (System.Net.HttpWebResponse)ex.Response;

                    dr["STATUS"] = errres.StatusCode;
                } 
            }
            finally
            {

            }
        }
        dt.AcceptChanges();
    }



0 件のコメント: