c# - startnew - Le eccezioni di un'attività non sono state osservate in Attesa sull'attività o accedendo alla relativa proprietà di eccezione. Di conseguenza, l'eccezione non osservata era




c# task new (2)

Prova questo:

public static void ThrowFirstExceptionIfHappens(this Task task)
{
    task.ContinueWith(t =>
    {
        var aggException = t.Exception.Flatten();
        foreach (var exception in aggException.InnerExceptions)
        {
            throw exception; // throw only first, search for solution
        }
    },
    TaskContinuationOptions.OnlyOnFaulted); // not valid for multi task continuations
}

public static Task CreateHandledTask(Action action) 
{
    Task tsk = Task.Factory.StartNew(action);
    tsk.ThrowFirstExceptionIfHappens();
    return tsk;
}

Cosa significa e come risolverlo?

Sto usando attività TPL.

L'intero errore

Le eccezioni di un'attività non sono state osservate in Attesa sull'attività o accedendo alla relativa proprietà di eccezione. Di conseguenza, l'eccezione non osservata è stata rimandata dal thread del finalizzatore.

a System.Threading.Tasks.TaskExceptionHolder.Finalize ()

mscorlib


Sicuro; significa che un'attività è stata finalizzata dopo essere stata lasciata alla raccolta dati inutili, ma l'attività in sé non è riuscita. Ci sono due correzioni:

  • gestire le attività fallite direttamente (usare ContinueWith(...) per iscriversi e controllare. .IsFaulted e .Exception nel parametro)
  • gestire l'evento TaskScheduler.UnobservedTaskException e contrassegnarlo come osservato (chiamare e.SetObserved() dopo aver registrato l'errore)






task-parallel-library