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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

.NET Framework

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

Q&A

解決済

2回答

15122閲覧

C# client.GetStringAsync で例外が頻発します

ksakurai

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

.NET Framework

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

0グッド

0クリップ

投稿2017/05/11 12:45

現在、C#を使って、スクレイピングをするアプリを作成しているのですが、

client.GetStringAsync の実行時に、
下記のような例外が頻発して起こります。

例外がスローされました:
'System.Threading.Tasks.TaskCanceledException' (mscorlib.dll の中)

また、発生するときとしないときがあり、
発生しないときは1プロセスの中で連続して処理を実行しても発生しません。

考えられる原因はありますでしょうか?

ソースコードと環境は下記になります。
ご教示いただけますと幸いです。

フレームワーク
.Net FrameWork4.5.2
IDE
Visual Studio 2017
OS
Win7 64bit

C#

1 static public void Main() 2 { 3 Scraper scraper = new Scraper(); 4 Task task = scraper.testExec(); 5 task.Wait(); 6 } 7 8 public async Task testExec() 9 { 10 for (int k = 0; k < 100; k++) 11 { 12 Debug.WriteLine(k); 13 14 string html = await getHTML("http://example.com/"); 15 ConvertDataTableToCsv(html); 16 string data = this.getContents(html); 17 System.Threading.Thread.Sleep(1000); 18 } 19 } 20 21 public async Task<string> getHTML(string url) 22 { 23 string htmlText; 24 25 using (HttpClient client = new HttpClient()) 26 { 27 Uri uri = new Uri(url); 28 29 client.DefaultRequestHeaders.Add( 30 "User-Agent", 31 "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3"); 32 33 client.DefaultRequestHeaders.Add("Accept-Language", "ja-JP"); 34 client.Timeout = TimeSpan.FromSeconds(1); 35 36 try 37 { 38 htmlText = await client.GetStringAsync(uri); 39 return htmlText; 40 } 41 catch (HttpRequestException e) 42 { 43 Exception ex = e; 44 45 while (ex != null) 46 { 47 ex = ex.InnerException; 48 Debug.WriteLine("例外メッセージ: {0} " + ex.Message); 49 } 50 } 51 52 return null; 53 } 54 } 55

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

ちょっと今検証できてないのでおそらくですが、、
client.Timeout = TimeSpan.FromSeconds(1);としているので、「GetStringAsyncの処理に1秒以上掛かったときにTaskがキャンセルされている」からだと思います。なんの目的でTimeoutを1secに設定しているのかが分からないのでなんともいえないですが、Timeout値を長くすれば今回のエラーはほぼ発生しなくなるはずです。まあちゃんとするなら、Timeoutの設定に関わらず「HttpClientのTaskはキャンセルされる可能性がある」という前提でコードを組むようにした方がいいです。

あと、質問とは関係ないのですが、HttpClientはIDisposableを実装しているくせにusing非推奨という曲者なので、2回以上呼ぶ可能性があるならメンバ変数化してしまうことをオススメします。
詳しくは以下の記事をどうぞ。
開発者を苦しめる.NETのHttpClientのバグと紛らわしいドキュメント - InfoQ

投稿2017/05/11 13:29

編集2017/05/11 13:36
tamoto

総合スコア4105

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

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

0

おっしゃるとおり、
client.Timeout = TimeSpan.FromSeconds(1);
をコメントアウトしたら例外が発生しなくなりました。
また、注意事項についてまでおしえていただきありがとうございます。

投稿2017/05/11 13:52

ksakurai

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問