none
TPLでタスクがキャンセルされる条件に付いて RRS feed

  • 質問

  • いつもお世話になっております。

    TPLのタスクの挙動について、質問があります。

    下記のように、CancellationTokenがfalseとして、タスクを実行しているのですが、タスクがキャンセルされてしまうことがあります。

    ==========================================

            private static int MAX_PARALLEL = int.Parse(ConfigurationManager.AppSettings["Task.MaxParallel"]);
            private static int MAX_QUEUE_WAIT = int.Parse(ConfigurationManager.AppSettings["Task.MaxQueueWait"]);

            private static readonly LimitedConcurrencyLevelTaskScheduler Lcts =
                new LimitedConcurrencyLevelTaskScheduler(MAX_PARALLEL, MAX_QUEUE_WAIT);

    // メイン処理(最大並列処理数および最大待機キュー数を指定)
                        TaskFactory factory = new TaskFactory(Lcts);

                        CancellationToken cancelToken = new CancellationToken(false);
                        Task<Object> task = factory.StartNew<Object>(() => run(request), cancelToken);
                        task.ContinueWith(
                            task1 => runComplete(task1),
                            TaskContinuationOptions.OnlyOnRanToCompletion);             // 処理成功時の事後処理
                        task.ContinueWith(
                            task1 => runFault(task1),
                            TaskContinuationOptions.OnlyOnFaulted);                     // 処理失敗時の事後処理
                        task.ContinueWith(
                            task1 => runCancel(task1),
                            TaskContinuationOptions.OnlyOnCanceled);                    // 処理中断時の事後処理

                        // タイムアウト時間を設定してWait(ただしタイムアウトしても処理は裏で継続させる)
                        bool isSuccess = task.Wait(request.Timeout, cancelToken);

    ==========================================

     

    明示的にタスクのキャンセルを行わないのにもかかわらず、タスクがキャンセルされてしまう条件について

    ご存知の方がいらっしゃいましたら、ご教授いただけると幸いです。よろしくお願いいたします。

    環境は以下の通りです。

    Visual Studio 2010、.Net Framework 4.0

     

    2013年4月4日 11:20