Я хотел бы выполнить действие в очереди с помощью 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();
}
}
'Action's не имеют возвращаемого значения, используйте' 'Func вместо этого. Хотя непонятно, что вы получаете от использования 'Task.Run', если вы немедленно блокируете ожидание завершения задачи. –
Lee
Действие асинхронное. – Will
@Will «Действие асинхронно» еще более запутанной причиной синхронного ожидания сразу после 'Task.Run' ... –