/// <summary> /// タイマー中断 /// </summary> private async void StopTimer() { try { AppendLog("タイマーストップ処理 開始"); // timerを停止 timer1.Enabled = false; // タスクのキャンセル tokenSource.Cancel(); // すべてのタスクがキャンセルされたことを確認する await Task.Run(() => { bool existsRunningTask = true; while (existsRunningTask) { existsRunningTask = false; // 各タスクの実行状態をチェック foreach (var task in taskList) { if (!task.IsCanceled && !task.IsCompleted) { // まだタスクが完了していなければチェックを続行 existsRunningTask = true; break; } } if (existsRunningTask) { // 300ms待機 (300msに根拠はない) Thread.Sleep(300); } } // 全タスク終了 AppendLogDelegate appendLog = new AppendLogDelegate(AppendLog); this.Invoke(appendLog, new Object[] { "全タスク終了" }); }); // タスクリストをクリア taskList.Clear(); // tokenSourceを削除 tokenSource.Dispose(); AppendLog("タイマーストップ処理 終了"); } catch (Exception e) { this.txtLog.AppendText(e.StackTrace); } }
/// <summary> /// 输出日志 /// </summary> /// <param name="msg"></param> public void AppendLogText(string msg) { if (this.InvokeRequired) { AppendLogDelegate d = new AppendLogDelegate(AppendLogText); this.Invoke(d, msg); } else { msg = string.Format("{0}:{1}{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msg, "\r\n"); SaveLogToFile(msg); txtLog.AppendText(msg); if (_enableAutoScroll) { this.txtLog.Focus(); this.txtLog.Select(this.txtLog.TextLength, 0); this.txtLog.ScrollToCaret(); } } }
/// <summary> /// ランダム時間停止するだけのタスク /// </summary> /// <param name="taskId"></param> /// <returns></returns> private Task RandomSleepTask(int taskId) { // CancellationTokenを取得 var token = tokenSource.Token; return(Task.Run(async() => { // Sleep時間を取得 (3,000 ~ 15,000) var rand = new Random(DateTime.Now.Millisecond + taskId); int waitTime = rand.Next(3000, 15000); // 開始ログの表示 string msg = string.Format(@"task{0} 開始: sleepTime={1}", taskId, waitTime); AppendLogDelegate appendLog = new AppendLogDelegate(AppendLog); this.Invoke(appendLog, new Object[] { msg }); // 指定時間 Sleep する await Task.Delay(waitTime, token); // cancelされた? token.ThrowIfCancellationRequested(); // 終了ログの表示 msg = string.Format(@"task{0} 終了", taskId); this.Invoke(appendLog, new Object[] { msg }); }, token).ContinueWith((t) => { if (t.IsCanceled) { // キャンセルされたときの処理 // -> キャンセルログの表示 AppendLogDelegate appendLog = new AppendLogDelegate(AppendLog); this.Invoke(appendLog, new Object[] { string.Format(@"task{0} キャンセル", taskId) }); } })); }