2014-11-18 1 views
0

я хочу сделать следующее:Как выполнять задачи синхронно и в порядке FIFO в Windows Runtime?

  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(); 
    } 
} 

ответ

0

Вы можете просто использовать 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); 
    } 
} 
+0

ConcurrentExclusiveSchedulerPair будет прерывать функцию «ожидание» и продолжить следующую запланированную задачу. Так что на самом деле это будет «эксклюзивно», но вторая функция начнет выполнение _before_ первая функция закончится. Это нежелательное поведение. – norekhov

+0

@norekhov: Что вы ожидаете от 'await'? 'Func ' не может иметь 'await'. –

0

Это старый вопрос, но все-таки ответ может быть полезным для кого-то.

Блокировка не гарантирует заказ задачи, вы должны использовать TaskScheduler.

Вы можете использовать FifoTaskScheduler код здесь: http://orderofcode.com/2016/05/06/fifo-order-task-scheduler/

или даже более сложным, что позволяет производить различные уровни concurency: https://msdn.microsoft.com/en-us/library/ee789351%28v=vs.100%29.aspx

или Вы можете использовать реализацию TaskScheduler из образцов Microsoft. Вы можете найти его в ParallelExtensionsExtras/TaskSchedulers в https://code.msdn.microsoft.com/samples-for-parallel-b4b76364

Смежные вопросы