如何在 Windows 运行时中以 FIFO 顺序同步执行任务
本文关键字:FIFO 顺序 同步 执行任务 Windows 运行时 | 更新日期: 2023-09-27 18:30:43
我想执行以下操作:
- 按调度函数调用的顺序执行一些操作。
- 以独占方式执行它们,并等待顶级操作完成,然后再开始下一个操作。
我写了以下代码,但我不喜欢它。有没有更好的方法?也许我应该以某种方式实现TaskScheduler
但我不知道如何等待顶级功能。
sealed class TaskSequence
{
readonly object _critical = new object();
Task _head;
public Task<TResult> RunAsync<TResult>(Func<TResult> action)
{
lock (_critical)
{
var _previous = _head;
var _next = Task.Run(() => TaskFunc(_previous, action));
_head = _next;
return _next;
}
}
static async Task<TResult> TaskFunc<TResult>(Task _previous, Func<TResult> action)
{
if (_previous != null)
await _previous;
return action.Invoke();
}
}
你可以只使用ConcurrentExclusiveSchedulerPair
:
sealed class TaskSequence
{
private readonly TaskFactory _factory = new TaskFactory(
new ConcurrentExclusiveSchedulerPair().ExclusiveScheduler);
public Task<TResult> RunAsync<TResult>(Func<TResult> action)
{
return _factory.StartNew(action);
}
}
这是一个老问题,但答案对某人来说仍然有用。
锁定不能保证任务排序,你应该使用任务计划程序。
您可以从这里使用 FifoTaskScheduler 代码:http://orderofcode.com/2016/05/06/fifo-order-task-scheduler/
甚至更复杂的一个,允许进行不同级别的同意:https://msdn.microsoft.com/en-us/library/ee789351%28v=vs.100%29.aspx
或者,您可以使用Microsoft示例中的任务计划程序实现。您可以在 ParallelExtensionsExtras/TaskSchedulers 下找到它https://code.msdn.microsoft.com/samples-for-parallel-b4b76364