如何在 Windows 运行时中以 FIFO 顺序同步执行任务

本文关键字:FIFO 顺序 同步 执行任务 Windows 运行时 | 更新日期: 2023-09-27 18:30:43

我想执行以下操作:

  1. 按调度函数调用的顺序执行一些操作。
  2. 以独占方式执行它们,并等待顶级操作完成,然后再开始下一个操作。

我写了以下代码,但我不喜欢它。有没有更好的方法?也许我应该以某种方式实现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();
    }
}

如何在 Windows 运行时中以 FIFO 顺序同步执行任务

你可以只使用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