2017-02-15 36 views
0

Я хотел бы выполнить действие в очереди с помощью Task.Run и получить возвращаемое значение из Action, и в случае успеха удалить их из очереди. Все действия в очереди возвращают тип Task<bool>. Когда код выполняется, действие выполняется успешно, но затем Task.Run в конечном счете терпит неудачу с:Как преобразовать результат возврата из задачи?

Невозможно привести объект типа «System.Threading.Tasks.Task» к типу «System.Threading.Tasks .Task`1 [System.Boolean].

Способ обновления ниже вызывается из базового класса в качестве задачи:

public void Init() 
{ 
    InitDaemon(); 

    KeepAliveTask = new Task(Run); 
    KeepAliveTask.Start(); 
} 

private void Run() 
    while(_keepAlive) 
    { 
     Update(); 
     Thread.Sleep(_updateMillSecs); 
    } 
} 

_keepAlive установлен в ложь, когда метод базового класса Close() называется.

void override Update() 
{ 
    private static Task<bool> _currentTask; 
    private static Queue<Action> _oisQueue = new Queue<Action>(); 

    // if there is at least one task in the queue and that task is complete 
    if (_oisQueue.Count > 0 && (_currentTask == null || _currentTask.IsCompleted)) 
    { 
     var action = _oisQueue.First(); 
     _currentTask = (Task<bool>)Task.Run(() => action()); 

     // if task was successful 
     if (_currentTask.Result) 
      _oisQueue.Dequeue(); 
    } 
} 
+1

'Action's не имеют возвращаемого значения, используйте' 'Func вместо этого. Хотя непонятно, что вы получаете от использования 'Task.Run', если вы немедленно блокируете ожидание завершения задачи. – Lee

+0

Действие асинхронное. – Will

+0

@Will «Действие асинхронно» еще более запутанной причиной синхронного ожидания сразу после 'Task.Run' ... –

ответ

0

Как об этом:

class Class1 
{ 
    private static Queue<Func<bool>> _oisQueue = new Queue<Func<bool>>(); 

    private async Task<bool> RunNextTask() 
    { 
     bool success = true; 

     if (_oisQueue.Any()) 
     { 
      success = await Task.Run(_oisQueue.First()); 
      _oisQueue.Dequeue(); 
     } 

     return success; 
    } 
}