Ich versuche, einige (in meinen Augen) seltsames Verhalten zu verstehen. Ich habe eine asynchrone Methode aufgerufen und möchte das Ergebnis abrufen. (DeleteIndexAsync
zurückgeben Task<bool>
)Versucht, Task.ContinueWith() zu verstehen
var deleteTask = Task.Run(() => DeleteIndexAsync(localItem))
.ContinueWith(t =>
{
//handle and log exceptions
}, TaskContinuationOptions.OnlyOnFaulted);
if (!deleteTask.Result)
In diesem Szenario Result
ist false
und die Status
ist WaitingForActivation
.
Während dieser Code tut, was ich will
var deleteTask = Task.Run(() => DeleteIndexAsync(localItem));
deleteTask.ContinueWith(t =>
{
//handle and log exceptions
return false;
}, TaskContinuationOptions.OnlyOnFaulted);
if (!deleteTask.Result)
Kann jemand erklären, warum? Und ist es möglich, async
/await
statt Task
hier zu verwenden?
Edit:
var deleteTask = Task.Run(() => ThrowEx());
bool errorOccurred = false;
deleteTask.ContinueWith(t =>
{
errorOccurred = true;
}, TaskContinuationOptions.OnlyOnFaulted);
if (errorOccurred)
{
return true;
}
Ich denke, überprüfen task.Result, um festzustellen, ob ein Fehler aufgetreten ist oder nicht, ist auch keine gute Idee? Der Aufruf von task.Result löst hier eine Ausnahme aus ... und auch das Flag Fault ist immer falsch, auch wenn eine Ausnahme ausgelöst wurde. – user3292642
@ user3292642 Ich glaube nicht, dass ich verstehe? Sie sollten auf die Eigenschaft 'Exception' zugreifen, um die Ausnahme zu verschlucken. – slawekwin
Ich möchte die Ausnahme nicht verschlucken. Ich logge es bereits in der Continue-Methode ein. Nachdem die Protokollierung durchgeführt wurde, möchte ich zurückkehren, wenn eine Ausnahme ausgelöst wurde, aber ich weiß nicht wie. Die Überprüfung des Status ist auch keine Option, denke ich. – user3292642