gpt4 book ai didi

c# - 如何从自定义 TaskScheduler 回退到默认 TaskScheduler

转载 作者:行者123 更新时间:2023-11-30 12:28:13 25 4
gpt4 key购买 nike

假设我想创建一个自定义 TaskScheduler,但在其中,如果某些条件不适用,则回退到默认值。我该怎么做?

例如

protected override void QueueTask(Task task) {
if (/* some condition */) {
/* schedule task manually, does not matter */
}

/* queue task on default -- how? */
}

protected override IEnumerable<Task> GetScheduledTasks() {
return Enumerable.Concat(/* my tasks */, /* tasks from default -- how? */);
}

最佳答案

我认为您不能(或不应该)这样做,即使您诉诸反射 hack。理论上,您需要从现有的非抽象任务调度程序中派生出您的自定义 TaskScheduler,例如ThreadPoolTaskScheduler .

但是,你不能因为all non-abstract implementations TPL 中的 TaskSchedulerprivateinternal

TaskScheduler.QueueTask 的情况下,可能很想简单地将调用转发给 Task.Start :

protected override void QueueTask(Task task) {
if (/* some condition */) {
/* schedule task manually, does not matter */
}

/* queue task on default -- how? */
task.Start(TaskScheduler.Default);
}

但是,您也不能这样做。 implementation of Task.Start在内部调用 TaskScheduler.QueueTask,这将导致无限递归。

此外,Task 对象在 Task.Start 中存储了对任务调度程序的引用。因此,比方说,如果您使用反射调用 ThreadPoolTask​​Scheduler.QueueTask,它会断开任务与其任务调度程序之间的连接。

因此,QueueTaskGetScheduledTasksTaskScheduler 的一些其他方法被声明为 protected 是有充分理由的>。如果您要实现自定义任务计划程序,则必须提供完整的实现。

关于c# - 如何从自定义 TaskScheduler 回退到默认 TaskScheduler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22583841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com