C#(プログラミング)の勉強中です。
visual studio 2017を使用して
タイマー(Windows.Forms.Timer)を利用して下記のloopを定期的に実行させるプログラムを作成しています。
例外処理のところでよく理解できておらず苦戦していますのでご教授お願いします。
webbrowserでページが表示出来ない・DownloadFileでダウンロード出来ない場合
例外処理が発生すると思いますが、例外処理が発生したときの処理は終了して
再度タイマーの時間がきた際には新規でloopを実行したいです。
現状、下記のソースで可能かと思っていましたが、疎通が取れるようになっても
lavel1が開始にならず、接続エラーの状態になっています。
原因・理由や改善方法等、出来るだけ初心者向けに回答していただけますと幸いです。
お手数おかけしますが回答お願いいたします。
追記
どんな例外処理が発生しても、その処理は終了して再度時間がきた際には1から「loop」の処理を開始したいです。
例えば、物理的にLANケーブルが抜けていた場合、webbrowserコントロールでもDownloadFileでも例外が発生すると思います。その処理は停止します。
途中でLANケーブルを挿しなおせば再度繋がるようになり、その後からタイマーの時間が来た際は例外処理が発生しないと思いますのでその際は普通に処理するという流れが良いです。
現状では挿しなおした後も、例外処理が発生する状態です。
C#
1# using は省略 2 3namespace WindowsFormsApp 4{ 5 public partial class Form1 : Form 6 { 7 // キャンセレーショントークンソース 8 private CancellationTokenSource CancellationTokenSource; 9 //タイマーの宣言 10 System.Windows.Forms.Timer timer2 = new System.Windows.Forms.Timer(); 11 public Form1() 12 { 13 InitializeComponent(); 14 //ボタン 15 button1.Enabled = true; 16 button2.Enabled = false; 17 //タイマー 18 loop(Main_loop); 19 } 20 public void button1_Click(object sender, EventArgs e) 21 { 22 //開始ボタンは有効・停止ボタンは無効 23 button1.Enabled = false; 24 button2.Enabled = true; 25 26 //タイマーのインターバル設定 27 timer2.Interval = intVal * 60000; 28 //タイマー有効化 29 timer2.Enabled = true; 30 } 31 private void button2_Click(object sender, EventArgs e) 32 { 33 //タイマーの停止 34 timer2.Enabled = false; 35 36 //開始ボタンは有効・停止ボタンは無効 37 button1.Enabled = true; 38 button2.Enabled = false; 39 } 40 41 public bool OpenWebWait() 42 { 43 try 44 { 45 //読み込み完了まで待つ 46 while (webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete) 47 { 48 //無処理 49 System.Windows.Forms.Application.DoEvents(); 50 System.Threading.Thread.Sleep(300); 51 } 52 53 return true; 54 } 55 catch (Exception) 56 { 57 return false; 58 } 59 } 60 61 62 //numericUpDown1 * 60秒 でループするタイマー 63 public void loop(EventHandler eventHandler) 64 { 65 timer2.Tick += new EventHandler(eventHandler); 66 timer2.Enabled = false; 67 } 68 private void Main_loop(object sender, EventArgs e) 69 { 70 try 71 { 72 //TLS1.2を使用・SSL自己証明書のスルー 73 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback); 74 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 75 //ファイルの保存先指定 76 string filepath = (保存先); 77 78 //label1の表示変更 79 label1.Text = "接続中"; 80 label1.Refresh(); 81 82 83 //接続 84 webBrowser1.Navigate(接続先URL); 85 86 //ページの読み込み完了まで待つ 87 OpenWebWait(); 88 89 // クッキーを取得する。 90 string cookieStr = webBrowser1.Document.Cookie; 91 92 // WebClientを生成する。 93 WebClient wc = new WebClient(); 94 Encoding enc = Encoding.UTF8; 95 96 // WebClientのヘッダ設定を行う。 97 wc.Headers[HttpRequestHeader.Cookie] = cookieStr; 98 99 //label1の表示変更 100 label1.Text = "ダウンロード中"; 101 label1.Refresh(); 102 103 //ダウンロード 104 wc.DownloadFile(ダウンロードURL); 105 wc.Dispose(); 106 107 108 109 } 110 catch (Exception w) when (w is ObjectDisposedException || w is InvalidOperationException || w is ArgumentOutOfRangeException || w is COMException) 111 { 112 //label1の表示変更 113 label1.Text = "接続エラー"; 114 label1.Refresh(); 115 116 //Console.WriteLine(w.Message); 117 //1秒待つ 118 Task.Delay(1000).Wait(); 119 } 120 catch (Exception w) when (w is COMException) 121 { 122 Console.WriteLine(w.Message); 123 Application.Exit(); 124 } 125 } 126 127 128 } 129 } 130} 131