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

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

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

HttpWebResponseの取得でフリーズ

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

■100736 / inTopicNo.1)  HttpWebResponseの取得でフリーズ
  
□投稿者/ 倍 (1回)-(2022/10/22(Sat) 20:22:38)

分類:[.NET 全般] 

2022/10/22(Sat) 20:24:53 編集(投稿者)
2022/10/22(Sat) 20:24:09 編集(投稿者)

<pre><pre>
<pre><pre>VB.NETを使ってダウンロードソフトを開発しております。


あるURLのファイル名を取得したいと考えています。


ほとんどのURLは以下のコードで問題無く取得できます。


ただ、URLによっては、まれに、

            Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)


の部分でフリーズしてしまうことがあります。

特にエラーも無しに止まってしまうので、
Try Catchなどでも拾うことができません。


どうすれば、フリーズ無しに取得できますか?
あるいは予めフリーズするかどうか知ることはできますか?

ちなみに、ファイル自体は存在していても
フリーズする時はフリーズします。




            Dim req As HttpWebRequest = CType(WebRequest.Create(URL), HttpWebRequest)

            req.Method = System.Net.Http.HttpMethod.Head.Method
            req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"


            Dim fileName As String = ""




            'URLによってはなぜか、ここでフリーズすることがある
            Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)


            ' ヘッダ情報からファイル名の取得
            Dim dispos As String = res.Headers("Content-Disposition")


            Dim dispos2 = System.Web.HttpUtility.UrlDecode(dispos)
            Dim dispos3 = Uri.UnescapeDataString(dispos)


            If Not String.IsNullOrEmpty(dispos) Then

                Dim re As New Regex(
                      "filename\s*=\s*           " &
                      "(?:                       " &
                      "  ""(?<filename>[^""]*)"" " &
                      "  |                       " &
                      "  (?<filename>[^;]*)      " &
                      ")                         " _
                      , RegexOptions.IgnoreCase _
                  Or RegexOptions.IgnorePatternWhitespace)

                Dim m As Match = re.Match(dispos)
                If m.Success Then
                    fileName = m.Groups("filename").Value
                End If
            End If

</pre></pre>

引用返信 編集キー/
■100737 / inTopicNo.2)  Re[1]: HttpWebResponseの取得でフリーズ
□投稿者/ 伝説のカレー (47回)-(2022/10/22(Sat) 21:33:48)
No100736 (倍 さん) に返信

ファイルの取得をUIスレッドで動かしてるなら
ファイルの取得に時間がかかるとその間画面はフリーズします
画面がフリーズしないようにするだけならファイルの取得をバックグラウンドスレッドでやればよいです

画面のフリーズではなくてファイルの取得がフリーズするのをどうにかしたいということなら
タイムアウトを設定してどうにかならないですかねー

引用返信 編集キー/
■100738 / inTopicNo.3)  Re[2]: HttpWebResponseの取得でフリーズ
□投稿者/ 倍 (2回)-(2022/10/22(Sat) 21:45:10)
No100737 (伝説のカレー さん) に返信

バックグラウンドスレッドで動かしていてファイルの取得でフリーズします。

タイムアウトする方法に関してですが、

Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)

でコードが走っている時に
これを止めるにはどのようにしたら良いですか?

引用返信 編集キー/
■100741 / inTopicNo.4)  Re[3]: HttpWebResponseの取得でフリーズ
□投稿者/ 伝説のカレー (48回)-(2022/10/23(Sun) 00:57:01)
No100738 (倍 さん) に返信
WebRequest.Timeout プロパティがあるようなのでこれを設定してみたらどうですかね

引用返信 編集キー/
■100743 / inTopicNo.5)  Re[3]: HttpWebResponseの取得でフリーズ
□投稿者/ WebSurfer (2579回)-(2022/10/23(Sun) 09:21:58)
No100738 (倍 さん) に返信

> バックグラウンドスレッドで動かしていてファイルの取得でフリーズします。
>
> タイムアウトする方法に関してですが、
>
> Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
>
> でコードが走っている時に
> これを止めるにはどのようにしたら良いですか?

.NET Framework 4.5 以降で利用できる async / await を使って非同期で実行されるタスクで
あれば以下の記事のようにしてキャンセルすることができます。

マネージド スレッドのキャンセル
https://learn.microsoft.com/ja-jp/dotnet/standard/threading/cancellation-in-managed-threads

非同期タスクのキャンセル
http://surferonwww.info/BlogEngine/post/2020/09/27/cancellation-of-async-task.aspx
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ