TPL: проверьте, не произошла ли ошибка при выполнении задачи в событии OnCompleted

У меня есть задача типа:

var migrateTask = Task.Run(() =>
    {
        //do stuff
     });

migrateTask.ConfigureAwait(true).GetAwaiter().OnCompleted(this.MigrationProcessCompleted);

Как узнать в методе MigrationProcessCompleted, если я получил исключение или задачу не удалось выполнить в начальном потоке (в блоке кода выполнения)?

Есть ли способ найти это, не делая задачу членом/свойством класса?


person Buda Gavril    schedule 27.10.2016    source источник
comment
Почему вы получаете ожидание и не используете Task.ContinueWith?   -  person Scott Chamberlain    schedule 27.10.2016
comment
потому что мне нужно выполнить MigrationProcessCompleted в потоке пользовательского интерфейса   -  person Buda Gavril    schedule 27.10.2016
comment
А можно ли использовать await?   -  person Scott Chamberlain    schedule 27.10.2016
comment
да, я могу использовать. Это мой первый опыт работы с задачами.   -  person Buda Gavril    schedule 27.10.2016


Ответы (1)


Вы никогда не должны действительно вызывать .GetAwaiter(), он предназначен для использования компилятором.

Если вы можете использовать await, ваш код будет таким же простым, как

public async Task YourFunc()
{

    Exception error = null
    try
    {
        await Task.Run(() =>
        {
            //do stuff
         });
    }
    catch(Exception ex)
    {
        error = ex;
    }

    MigrationProcessCompleted(error)
}

private void MigrationProcessCompleted(Exception error)
{
     //Check to see if error == null. If it is no error happend, if not deal withthe error.
}
person Scott Chamberlain    schedule 27.10.2016
comment
В этом случае в коде внутри блока запуска возникает исключение, будет ли оно перехвачено в блоке перехвата? Потому что я слышал, что исключение не генерируется, когда оно происходит... - person Buda Gavril; 27.10.2016
comment
await заставляет его попасть в блок catch. если бы вы сделали Task.Run без await, то вы были бы правы. - person Scott Chamberlain; 27.10.2016