public void RunAsync() { Stop(); /* ステータス初期化 */ ClearMessage(); ClearComment(); AddMessage(ScriptMessageType.Informational, "<< Script Build and Start >>"); if ((script_code_ == null) || (script_code_.Length == 0) ) { return; } lock (task_sync_obj_) { script_busy_ = true; /* スクリプトタスク開始 */ if (task_thread_ == null) { task_thread_ = new Thread(RunTask); task_sandbox_ = new ScriptSandbox(this, task_thread_); task_thread_.Start(); task_watcher_ = (new RunTaskWatcherHandler(RunTaskWatcher)).BeginInvoke(null, null); } } /* 開始イベント */ StatusChanged?.Invoke(this, EventArgs.Empty); }
public void Stop() { StopAsync(); /* 実行中タスクを取得 */ var task_thread = (Thread)null; /* 多重解放を防ぐため実行中タスクを未登録にする */ lock (task_sync_obj_) { task_thread = task_thread_; task_thread_ = null; task_sandbox_ = null; } /* 実行中タスクを停止 */ if (task_thread != null) { if (!task_thread.Join(TASK_EXIT_WAIT_TIME)) { /* 正常終了しない場合は強制終了 */ task_thread.Abort(); } } /* 監視タスクが停止するまで待つ */ while ((task_watcher_ != null) && (!task_watcher_.IsCompleted)) { } }