画像データを読み込むためにSystem.Net.WebClientの関数「OpenReadTaskAsync」を使用しています。
たいていのURLは読み込めますがURLによっては関数が終了しないことがあります。
WebClientを継承してタイムアウトの時間を変更もしましたが、指定した時間を超過しても関数が終わりません。
理想としては画像が読み込めるように修正するか、読み込めない場合は正しく終了させたいと考えています。
修正方法を教えて頂けないでしょうか。
ソース
//実行する関数 public async void CallTest() { await CalcPerceptualDhash("https://joshinweb.jp/emall/img/sm/JSN_C00001/middle/45/71237/4571237660542.jpg").ConfigureAwait(false); } private class MyWebClient : WebClient { protected override WebRequest GetWebRequest(Uri uri) { WebRequest w = base.GetWebRequest(uri); w.Timeout = 3 * 1000; return w; } } /// <summary> /// /// </summary> /// <param name="url"></param> /// <returns></returns> public static async Task<string> CalcPerceptualDhash(String url) { Bitmap image = null; try { using (var wc = new MyWebClient()) { using (var stream = await wc.OpenReadTaskAsync(url).ConfigureAwait(false)) { image = new Bitmap(stream); } } } catch (Exception ex) { } if (image == null) { return null; } return null;//読み込んだ後の処理は省略 }
参考
How to change the timeout on a .NET WebClient object
https://stackoverflow.com/questions/1789627/how-to-change-the-timeout-on-a-net-webclient-object
まず catch (Exception ex) で例外をなかったことにするのは止めましょう。
>まず catch (Exception ex) で例外をなかったことにするのは止めましょう。
実際の処理ではログに出力しておりますが、質問内容には全く関係ないので省略しています。
> 実際の処理ではログに出力しておりますが、質問内容には全く関係ないので省略しています。
質問にそう書いといてください。
それを追記することで今回の質問内容に何か影響が出るのでしょうか。
もしあるのであれば次回から留意させていただきます。
恥をかくのはあなた。もうどうでもいい。ご勝手に
質問内容に影響がないなら書かなくて良い、というのであれば、try-catchブロックも書く必要ないやん。
質問者がどういう意図でコードを削ってるのかという意図は第三者にはわかんないんだから、中途半端に省略するぐらいなら全部書かくべきだし、本当に影響がない事が確認できているから省略する(つまり中途半端ではないという自信がある)、というのであればtry-catchブロック含めて書かない方が良いでしょう。
一般的に悪習とされるコード載せられて「これで問題が起きたけどどこが悪いんでしょうか?」って聞かれても、質問者の知識や調査力、理解力に疑問を抱くだけで、ちゃんと回答しても理解できないんじゃないか、と不審に思われるデメリットはあっても、メリットが一切ない。
せめてcatchブロック内で「// ここでログを出力」とか書いてあるならわかるけども。
あなたの回答
tips
プレビュー