/// <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);
            }
        }
示例#2
0
 /// <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) });
                }
            }));
        }