C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: プログラムが途中で終了する理由がわかりません


(過去ログ 126 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■74731 / inTopicNo.1)  プログラムが途中で終了する理由がわかりません
  
□投稿者/ ひでき (3回)-(2015/01/26(Mon) 21:55:41)

分類:[Java] 

配列に入ったURLがアクセスできる正しいURLか調べるメソッドをつくているのですが3つ目で、PCがフリーズしてしまいます。

    private void button1_Click(object sender, EventArgs e)
{
string[] url = { "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/", "http://www.yahoo.co.jp/" };
for (int i = 0; i < 5;i++ )
{
try
{
MessageBox.Show(i.ToString());
HttpWebRequest req = WebRequest.Create(url[i]) as HttpWebRequest;
HttpWebResponse res = null;
res = req.GetResponse() as HttpWebResponse;
}
catch
{
MessageBox.Show("このページにはアクセスできません。");
}


}

MessageBox.Show("まわりおわったよ");


}


理由がわかる方いらっしゃいますか?
引用返信 編集キー/
■74732 / inTopicNo.2)  Re[1]: プログラムが途中で終了する理由がわかりません
□投稿者/ ひでき (4回)-(2015/01/26(Mon) 21:56:45)
環境をかきわすれました。
PCはwin8のメモリ4G
開発環境はVS2010でC#を使っています。
引用返信 編集キー/
■74733 / inTopicNo.3)  Re[2]: プログラムが途中で終了する理由がわかりません
□投稿者/ Hongliang (271回)-(2015/01/26(Mon) 22:17:07)
プログラムが途中で終了するわけではなく、PCがフリーズするのでもなく、フォームが応答無しになっている状態では無いでしょうか。

・重い処理は別スレッドで行うようにしましょう。.NET 4だとTaskまたはBackgroundWorkerでしょうか。
・一つのホストに対する同時接続数は、デフォルトでは2になっていたはずです。
 GetResponseで取得したHttpWebResponseを放置しているので、その接続はしばらくつながりっぱなしになります。
 3つめになって同時接続数上限に引っかかり、一つ前の接続がそのうち切れるのを待機している状態でしょう。
 HttpWebResponseはUsing構文を使って使い終わったら直ちに接続を閉じるようにしましょう。
 https://msdn.microsoft.com/ja-jp/library/htd05whh.aspx
引用返信 編集キー/
■74737 / inTopicNo.4)  Re[3]: プログラムが途中で終了する理由がわかりません
□投稿者/ ひでき (5回)-(2015/01/27(Tue) 11:12:04)
No74733 (Hongliang さん) に返信
> プログラムが途中で終了するわけではなく、PCがフリーズするのでもなく、フォームが応答無しになっている状態では無いでしょうか。
おっしゃる通りです。



参考サイトを見せていただいたのですが、
>Using構文を使って使い終わったら直ちに接続を閉じる
というのが少しわからないです。

res.Close();
とは違うのでしょうか?

引用返信 編集キー/
■74739 / inTopicNo.5)  Re[4]: プログラムが途中で終了する理由がわかりません
□投稿者/ daive (37回)-(2015/01/27(Tue) 11:26:16)
2015/01/27(Tue) 11:28:34 編集(投稿者)

たとえば、
−usingを使え、使えったら使え(^^)−
http://www.divakk.co.jp/aoyagi/csharp_tips_using.html
を、参照してみてください。
あれ??分類:JAVAでしたけど?C#ですよね??
引用返信 編集キー/
■74741 / inTopicNo.6)  Re[4]: プログラムが途中で終了する理由がわかりません
□投稿者/ Hongliang (272回)-(2015/01/27(Tue) 11:30:30)
> res.Close();
> とは違うのでしょうか?

Usingは、これを勝手にやってくれる言語構文です。
(厳密には呼び出すのはCloseではなくDisposeですが、ほとんどの場合同じ意味になります)
以下の2つの構文が等価になります。

' Usingを使わない場合
Dim obj As IDisposable = Nothing ' 実際にはHttpWebResponseとか
Try
    obj = CreateDisposable()  ' 実際にはreq.GetResponse()とか
    ' ここでobjを使った処理
Finally
    If Not(obj Is Nothing) Then
        obj.Dispose()
    End IF
End Try

' Usingを使う場合
Using obj As IDisposable = CreateDisposable()
    ' ここでobjを使った処理
End Using

なぜTry-FinallyやUsingを使うのかというと、途中で例外が発生した場合に備えてです。
「objを使った処理」内で例外が出た場合、Try-FinallyやUsingを使っていないと、
処理が飛ばされてしまってDispose(=Close)することができなくなります。

Dim obj As IDisposable = CreateDisposable()
Throw New InvalidOperationException("test")
obj.Dispose() ' 呼び出されない

引用返信 編集キー/
■74803 / inTopicNo.7)  Re[5]: プログラムが途中で終了する理由がわかりません
□投稿者/ ひでき (6回)-(2015/01/29(Thu) 21:01:36)
返信おそくなりました。時間が開いてしまいすみませんでした。

daiveさん

すみません。JAVAになっていますがC#です。間違えていますね。
サイト参考にさせていただきました。

Hongliangさん
例のソースありがとうございます。



usingでの実装を考えてみたのですが、まだよくわからないというのが本音です。
usingではcatchがないので、僕の書いているソースだと、access = false;にすることが困難かなと思いました。
daiveさんの紹介してくれたサイトを参考にしたところ、usingのなかでtryをしているものも紹介されていましたが、今回の場合読み込めないURLが来た時にエラーを吐くのが先の
HttpWebRequest req = WebRequest.Create(URL) as HttpWebRequest;
部分であるため、先にusing(HttpWebRequest req = WebRequest.Create(URL) as HttpWebRequest)をするとaccessにfalseが入らなくなるというのが理由です。また、
「暗黙的にIDisposableに変換できない」というエラーがでるのですが、この書き方以外の書き方がわからないのが現状なので、Close();やDispose()しかしょうがないのかなと思っていとりあえず、コチラのパターンで試していこうと思います。


Close();やDispose()を使った場合もまだうまく行ってはいないのでなんとも言えませんが申込し粘ってみたいと思います。


引用返信 編集キー/
■74804 / inTopicNo.8)  Re[6]: プログラムが途中で終了する理由がわかりません
□投稿者/ ひでき (7回)-(2015/01/29(Thu) 21:04:19)
書いているソースを載せ忘れました。意味の分からない解答になってしまいました。

		public bool checkAccess(String URL)
		{
			bool access = true;
			Clipboard.SetText(URL);
			//アクセスして表示できればTrue
			HttpWebRequest req;
			HttpWebResponse res = null;

			try
			{
				req = WebRequest.Create(URL) as HttpWebRequest;
				res = req.GetResponse() as HttpWebResponse;
			}
			catch
			{
				access = false;
			}

			if (res != null)
			{
				res.Close();
			}

			return access;
		}

このように、URLを判定するメソッドを作っています。

引用返信 編集キー/
■74807 / inTopicNo.9)  Re[6]: プログラムが途中で終了する理由がわかりません
□投稿者/ WebSurfer (483回)-(2015/01/29(Thu) 23:57:23)
No74803 (ひでき さん) に返信

> usingではcatchがないので、僕の書いているソースだと、access = false;
> にすることが困難かなと思いました。

最初の質問によると「URLがアクセスできる正しいURLか調べる」とありましたが、その目的は
変わってないですよね?

アップされたコードを見ると「例外の発生」=「URL がアクセスできる正しい URL ではない」と
されているようですが、そこのところがまず目的に適ってないと思いますが。

そうではなくて、例えば(あくまで例えばですよ)、返ってきた HttpWebResponse.StatusCode プ
ロパティが OK だったら「URL がアクセスできる正しい URL」と判定するというような話になるの
ではないでしょうか?

HttpWebResponse.StatusCode プロパティ
https://msdn.microsoft.com/ja-jp/library/system.net.httpwebresponse.statuscode(v=vs.110).aspx

(OK が帰ってこなくても、必ずしも「URL が正しくない」とは限らないのですが、それはまた別
の問題として考えるとして)

そうすれば例外を catch する必要は無いはずです。何にせよ catch の使い方は「間違っている」
といっていいレベルだと個人的には思います。

例外処置については以下の記事が参考になると思いますので、よく目を通して置かれることをお
勧めします。その Part 1 に書いてあるように「よほどのことがない限り、アプリケーションで
try-catch を書いてはいけません。」と自分も思います。

.NETの例外処理 Part.1
http://blogs.msdn.com/b/nakama/archive/2008/12/29/net-part-1.aspx

.NETの例外処理 Part.2
http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-2.aspx

using と try-finally については、Part 2 の[IDisposable インタフェースと using ブロック
による try-finally の記述]のセクションに詳しく書いてあるので見てください。

引用返信 編集キー/
■74872 / inTopicNo.10)  Re[7]: プログラムが途中で終了する理由がわかりません
□投稿者/ ひでき (8回)-(2015/02/04(Wed) 22:19:08)
御返事遅くなりました。


なんとかusingを使用して組むことが出来ました。
大変勉強になりました。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -