使用Task对象和Monitor Thread进行长时间运行的进程

时间:2012-11-05 20:41:05

标签: c# .net c#-4.0 task-parallel-library

我正在尝试监控长时间运行的进程。现在,该进程为所有小块创建了新的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)它是否可能锁定在其上面创建的部分任务?我需要监视器不时检查状态,但我不希望它等待条件杀死需要运行的另一个任务。

编辑:

所以我找到了一个有趣的方法,与汉斯在下面的评论中提出的方法非常相似。它分为两部分。一个任务在中间多次发生,一个完成任务进行最后的清理。仍处于测试阶段,但看起来很有希望。

这是它的样子:

            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();

0 个答案:

没有答案