2017-02-15 7 views
0

Ich möchte eine Aktion in einer Warteschlange mit Task.Run ausführen und den Rückgabewert von der Aktion abrufen, und wenn sie erfolgreich ist, entfernen Sie sie aus der Warteschlange. Alle Aktionen im Queue-Rückgabetyp Task<bool>. Wenn der Code ausgeführt wird, wird die Aktion erfolgreich ausgeführt, aber dann scheitert die Task.Run schließlich mit:Wie konvertiert man das Ergebnis einer Aufgabe?

Kann nicht das Objekt des Typs ‚System.Threading.Tasks.Task‘ werfen ‚System.Threading.Tasks eingeben .Task`1 [System.Boolean] '.

public void Init() 
{ 
    InitDaemon(); 

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

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

_keepAlive auf false gesetzt ist, wenn ein Schließen der Basisklasse() -Methode aufgerufen wird:

Das folgende Update-Methode wird von einer Basisklasse als Aufgabe genannt.

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 keine Rückgabewerte haben, verwenden Sie' Func 'statt. Obwohl es nicht klar ist, was Sie durch die Verwendung von 'Task.Run' erreichen, wenn Sie sofort das Warten auf den Abschluss der Aufgabe blockieren. – Lee

+0

Die Aktion ist asynchron. – Will

+0

@Will "Die Aktion ist asynchron" ist noch verwirrender Grund synchron nach "Task.Run" zu warten ... –

Antwort

0

Wie wäre es damit:

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; 
    } 
} 
Verwandte Themen