0

長時間実行されているプロセスを監視しようとしています。現在、プロセスはすべての小さな部分に対して新しい Task オブジェクトを作成しましたが、進行状況を監視してステータスを UI に送信する何らかの方法が必要です。

ExecutionContext ctx = new ExecutionContext()
        {
            Result = result,
            LastCount = result.Values.Count
        };

        Task t = Task.Factory.StartNew(() =>
            {
                foreach (var dataSlice in dataObjects)
                {
                   Task.Factory.StartNew(() =>
                   {
                       // Do Some Work
                   }, TaskCreationOptions.AttachedToParent);
                }
            });

        ctx.ParentTask = t;


        Task monitor = Task.Factory.StartNew( () =>
            {
                ctx.LastCount = ctx.Result.Values.Count;

            }, TaskCreationOptions.LongRunning);

私の問題、またはおそらく質問は、監視タスクを (SpinWait または Sleep を介して) 強制的に待機させると、その上に作成されたタスクの一部がロックされる可能性があるかどうかです。時々ステータスをチェックするためにモニターが必要ですが、実行する必要がある別のタスクを強制終了するための待機状態は望ましくありません。

編集:

そこで、以下のコメントでハンスが提案したものと非常によく似た興味深いアプローチを見つけました。2ピースで提供されます。途中で複数回発生する 1 つのタスクと、最終的なクリーンアップを行う 1 つの完了タスク。まだテスト中ですが、有望に見えます。

外観は次のとおりです。

            Task t = new Task(() =>
            {
                int i = 0;
                for (int j = 0; j < 200; j++)
                {

                    foreach (var session in sessions)
                    {
                        Task work = action.Invoke(SomeParameter);
                        if (i == 50 || i == 0)
                        {
                            work.ContinueWith(task => Task.Factory.StartNew(UpdateAction));
                            i = 1;
                        }
                        else
                        {
                            i++;
                        }
                    }
                }
            });

        ctx.ParentTask = t;

        t.ContinueWith(CompletionAction => Task.Factory.StartNew(() => CompleteExecution(SomeParameter)));

        t.Start();
4

0 に答える 0