/// <summary> /// コンストラクタ /// </summary> public MainWindowViewModel() { this.SaveMinutesCommand = new DelegateCommand(SaveMinutes, CanSaveMinutes); this.StartInstantSaveCommand = new DelegateCommand(StartInstantSave, CanStartInstantSave); this.ChangeToggleSwitchCommand = new DelegateCommand(ChangeToggleSwitch, CanChangeToggleSwitch); //m_MinutesModelのm_IsInstantSaveExecutingと双方向バインディングする m_IsInstantSaveExecuting = m_MinutesModel.ToReactivePropertyAsSynchronized(x => x.m_IsInstantSaveExecuting); //どのタイミングでCanExecute()がtrueになるかを設定(今回は常に実行可能にしとく) InstantSaveMinutesCommand = m_IsInstantSaveExecuting.Select(e => true).ToReactiveCommand(); //実際のコマンドを登録(メッセンジャー経由でViewとViewModel間でやりとりできるようにする) InstantSaveMinutesCommand.Subscribe( _ => Messenger.Instance .GetEvent <PubSubEvent <bool> >().Publish(m_MinutesModel.InstantSaveContents())); //ChangeToggleSwitchCommand.Subscribe(); m_SelectableTimeList = new List <string> { "07:00", "07:15", "07:30", "07:45", "08:00", "08:15", "08:30", "08:45", "09:00", "09:15", "09:30", "09:45", "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30", "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15", "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00", "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45", "16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00", "20:15", "20:30", "20:45", "21:00", "21:15", "21:30", "21:45", }; }
private void StartInstantSave() { if (m_MinutesModel.m_IsInstantSaveExecuting == false) { m_MinutesModel.m_IsInstantSaveExecuting = true; if (_TokenSource == null) { _TokenSource = new CancellationTokenSource(); } _InstantSaveTask = Task.Factory.StartNew(() => { while (m_MinutesModel.m_IsInstantSaveExecuting == true) { try { // キャンセル要求がきていたらOperationCanceledException例外をスロー _TokenSource.Token.ThrowIfCancellationRequested(); } catch (OperationCanceledException) { break; } InstantSaveMinutesCommand.Execute(); //設定された時間だけスリープ(設定は秒でおこなってもらう) Thread.Sleep(Properties.Settings.Default.InstantSaveTimeSpan * 1000); } }, _TokenSource.Token).ContinueWith(t => { if (_TokenSource != null) { _TokenSource.Dispose(); } _TokenSource = null; if (t.IsCanceled) { } }); } else { try { m_MinutesModel.m_IsInstantSaveExecuting = false; //キャンセル要求 if (_TokenSource != null) { _TokenSource.Cancel(true); } //スレッド終了待ち //_InstantSaveTask.Wait(); } catch (OperationCanceledException oe) { //タスクキャンセル時に実行される Console.WriteLine("Instant Save Cancelled."); } } }