我正在尝试监视一个长时间运行的进程。现在,该过程为所有小块创建了新的任务对象,但我需要一些方法来监控它们的进度以将状态发送到 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 或睡眠)它可能会锁定在它上面创建的部分任务吗?我需要监视器不时检查状态,但我不希望它的等待条件杀死另一个需要运行的任务。
编辑:
所以我发现了一种有趣的方法,它与 Hans 在下面的评论中建议的方法非常相似。它分为两部分。一项任务在中间多次发生,一项完成任务进行最后的清理。仍在测试中,但看起来很有希望。
这是它的样子:
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();