質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

8682閲覧

VB.net HttpClientを使ってのFORMからのHttpアクセス

komasannkomatta

総合スコア28

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/10/21 09:58

環境
VB.net
(VisualStudio2019 .net Framework 4.8)

HttpClientを使用して、Httpアクセスをしようと思い、以下のページにあったサンプルを作成してみたのですが、動作しません。
コンソールアプリとして実行したときは動作するのですが、同じコードをフォームに張り付け、ボタン押下で実効しようとすると、response = Await clinet.GetAsync(url)の行で固まり応答がありません。
フォーム上より動作させるときは何かサンプルに手を加える必要があるのでしょうか。

サンプルページ
https://windev.just4fun.biz/?.NET/HttpClient%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9FURL%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B#ib970018

コンソールアプリ

VB

1 Sub Main(args As String()) 2 Dim urls As String() = {"https://just4fun.biz/me.html", "https://windev.just4fun.biz/me.html"} 3 Dim client As HttpClient = New HttpClient() 4 5 For Each url As String In urls 6 Dim content As String = (HtmlContent(url, client)).Result 7 Console.WriteLine("URL:{0}, Content:{1}", url, content) 8 Next 9 End Sub 10 11 Private Async Function HtmlContent(ByVal url As String, ByVal clinet As HttpClient) As Task(Of String) 12 Dim response As HttpResponseMessage = Nothing 13 Console.WriteLine("Connect {0}...", url) 14 15 Try 16 response = Await clinet.GetAsync(url) 17 response.EnsureSuccessStatusCode() 18 Dim responseBody As String = Await response.Content.ReadAsStringAsync() 19 Return Await response.Content.ReadAsStringAsync() 20 Catch ex As Exception 21 Console.WriteLine("Exception Message :{0} ", ex.Message) 22 End Try 23 24 Return Nothing 25 End Function

フォーム

VB

1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2 Dim urls As String() = {"https://just4fun.biz/me.html", "https://windev.just4fun.biz/me.html"} 3 Dim client As HttpClient = New HttpClient() 4 5 For Each url As String In urls 6 Dim content As String = (HtmlContent(url, client)).Result 7 Console.WriteLine("URL:{0}, Content:{1}", url, content) 8 Next 9 10 End Sub 11 Private Async Function HtmlContent(ByVal url As String, ByVal clinet As HttpClient) As Task(Of String) 12 Dim response As HttpResponseMessage = Nothing 13 Console.WriteLine("Connect {0}...", url) 14 15 Try 16 response = Await clinet.GetAsync(url) 17 response.EnsureSuccessStatusCode() 18 Dim responseBody As String = Await response.Content.ReadAsStringAsync() 19 Return Await response.Content.ReadAsStringAsync() 20 Catch ex As Exception 21 Console.WriteLine("Exception Message :{0} ", ex.Message) 22 End Try 23 24 Return Nothing 25 End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/21 12:06 編集

参考にした記事は url の文字列を記載するだけではなくリンクを張ってください。そうしてもらえないと、たぶんほとんどの閲覧者は見る気がしないと思います。(なので、自分は見てません)
komasannkomatta

2020/10/21 13:27

SurferOnWww様 ご指摘ありがとうございます。 今後、何か投稿させていただく際は、気をつけます。
退会済みユーザー

退会済みユーザー

2020/10/21 13:30

今からでも修正できるのでやってください。
退会済みユーザー

退会済みユーザー

2020/10/22 02:29

なんでもいいから結果オーライで良いということなのかな? もうここは見てないようで上のコメントでお願いした修正もしないし・・・ 趣味のサンデープログラマーならどうでもいいですけど、仕事で開発しているとすると、この調子では自分に何らかの悪影響が出るかもしれない(インフラが止まるとか、情報漏洩につながるとか)のが恐ろしいです。
退会済みユーザー

退会済みユーザー

2020/10/22 08:39

前にお願いした以下のことはやっていただけないのですか? 参考にした記事は url の文字列を記載するだけではなくリンクを張ってください。
guest

回答2

0

ベストアンサー

こうしたら良いんじゃ?

DIFF

1- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2+ Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 3 Dim urls As String() = {"https://google.com/", "https://windev.just4fun.biz/me.html"} 4 Dim client As HttpClient = New HttpClient() 5 6 For Each url As String In urls 7- Dim content As String = (HtmlContent(url, client)).Result 8+ Dim content As String = Await HtmlContent(url, client) 9 Console.WriteLine("URL:{0}, Content:{1}", url, content) 10 Next 11 End Sub

投稿2020/10/21 11:46

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

komasannkomatta

2020/10/21 13:25

gentaro様 ご指摘ありがとうございます。 記述していただいた箇所を参考にし、下記の様に修正し動作させることができました。 修正前 Dim content As String = (HtmlContent(url, client)).Result 修正後 Dim t As Task(Of String) = Task.Run(Function() HtmlContent(urls, client))
gentaro

2020/10/21 18:20

まぁ回答の意味を理解してないんだろうな、とは思いますが、それで満足してるなら別に良いです。
komasannkomatta

2020/10/22 08:30

度々お世話になります。 おっしゃる通り、とりあえず動いた!という状態です。 色々なサイトのサンプルを見比べて、こんな感じかなと試してエラー、試してエラーを繰り替えしています。 SurferOnWww様に紹介いただいた以下のページを読んでみましたが、とりあえず仕組みが違う程度でぼんやりとした状態のままで理解はできておりません。 この辺りついては、再度読込なおします。 安易な質問と解決としてしまったことで、ご回答いただきましたお二方に不快な思いをさせてしまい、大変申し訳ございませんでした。 紹介していただいた記事  非同期プログラミングのベスト プラクティス  await と Task.Result によるデッドロック
guest

0

デッドロックの問題だと思います。

問題は (HtmlContent(url, client)).Result の Result プロパティです。これは Wait メソッドを呼び出すことと同じで、非同期操作が完了するまで呼び出し元のスレッドがブロックされます。

コンソールアプリと GUI アプリでは仕組みが違っていて、前者はデッドロックにならなくても後者はデッドロックになります。

詳しくは以下の記事を見てください。

非同期プログラミングのベスト プラクティス
https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming

await と Task.Result によるデッドロック
http://surferonwww.info/BlogEngine/post/2020/09/20/deadlock-caused-by-await-and-task-result.aspx

投稿2020/10/21 11:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

komasannkomatta

2020/10/21 13:24

SurferOnWww様 ご指摘ありがとうございます。 下記の様に修正し動作させることができました。 修正前 Dim content As String = (HtmlContent(url, client)).Result 修正後 Dim t As Task(Of String) = Task.Run(Function() HtmlContent(urls, client))
退会済みユーザー

退会済みユーザー

2020/10/22 03:47 編集

なにも理解してないのでは? なぜ GUI アプリではダメだったのか、どうすべきだったのか本質的なところを理解してないと思いますけど・・・ なんでもいいから結果オーライというわけではないですよね?
komasannkomatta

2020/10/22 08:30

度々お世話になります。 おっしゃる通り、とりあえず動いた!という状態です。 色々なサイトのサンプルを見比べて、こんな感じかなと試してエラー、試してエラーを繰り替えしています。 SurferOnWww様に紹介いただいた以下のページを読んでみましたが、とりあえず仕組みが違う程度でぼんやりとした状態のままで理解はできておりません。 この辺りついては、再度読込なおします。 安易な質問と解決としてしまったことで、ご回答いただきましたお二方に不快な思いをさせてしまい、大変申し訳ございませんでした。
退会済みユーザー

退会済みユーザー

2020/10/22 23:48 編集

紹介した Microsoft のドキュメントの中の「すべて非同期にする」のセクションに注目してください。そこに書いてあります、 "プログラマーがテスト コンソール プログラムを作成し、部分的な非同期コードが想定どおりに動作するのを確認した後、同じコードを GUI アプリケーションまたは ASP.NET アプリケーションに移行するとデッドロックが発生する場合があるため、混乱が生じます" が今回の質問者さんのケースにドンピシャと思うのですが違いますか? 対処方法はそのセクションのタイトル「すべて非同期にする」です。 では、具体的にどうすればいいかは gentaro さんの回答にあります。 質問者さんの解決策はそれとも違うし、回答を見ていないと思わざるを得ないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問