gpt4 book ai didi

c# - 在 .NET 中安排具有优先级的任务

转载 作者:行者123 更新时间:2023-12-05 03:55:11 28 4
gpt4 key购买 nike

在 .NET 中,我想安排大量的 Task,例如通过 Task.Run(...)。一些任务重要性较低,如果有更高优先级的任务可供执行,则应由调度程序延迟。

有没有办法做到这一点? .NET 中似乎没有TaskScheduler 支持任何优先级的调度。

这些任务是短期运行的和非分层的。需要明确的是,这与执行任务的线程的优先级完全无关。

QueuedTaskScheduler 来自 ParallelExtensionsExtras似乎是我正在寻找的东西,但它已经七年没有维护了,缺少文档并且大部分相关链接都已损坏 - 我宁愿不添加对它的依赖。

最佳答案

如果您想保持简单,请排队一个 Action 而不是一个任务。由于我们正在排队异步调用,因此队列类型为 Func<Task> .为不同的优先级使用两个队列。

ConcurrentQueue<Func<Task>> _highPriorityQueue;
ConcurrentQueue<Func<Task>> _lowPriorityQueue;

然后创建一个 worker proc 以按优先顺序检查两个队列。

async Task WorkerProc(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
Func<Task> action;
if (_highPriorityQueue.TryDequeue(out action))
{
await action();
continue;
}
if (_lowPriorityQueue.TryDequeue(out action))
{
await action();
continue;
}
await Task.Yield();
}
}

然后启动一些线程来处理队列:

var source = new CancellationTokenSource();
var threads = Enumerable.Range(0, numberOfThreads).Select( i =>
Task.Run( () => WorkerProc(source.GetToken()) )
).ToList();

添加到队列中:

_highPriorityQueue.Enqueue( () => Foo() );
_lowPriorityQueue.Enqueue( () => Bar() );

关闭:

source.Cancel();
await Task.WhenAll( threads );

关于c# - 在 .NET 中安排具有优先级的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60350590/

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