Не удается поймать исключение в фоновой задаче

Моя проблема заключается в том, что если я отлаживаю фоновую задачу моего Windows 8 Store App и получаю Error (при вызове метода асинхронного вызова). Он не переходит в мой аккаунт . Отладчик переходит к методу deferral.Complete() в конце кода фоновой задачи (в методе Run для IBackgroundTask )).

Вот мой код:

public sealed class TileUpdater: IBackgroundTask {
    public void Run(IBackgroundTaskInstance taskInstance) {
        var defferal=taskInstance.GetDeferral();
        InstantSchedule();
        defferal.Complete();//<- Debugger jumps over here after error
    }

    public static async void InstantSchedule() {
        try {
            [...]

           //Error occurs here
            IEnumerable logentities=
                account.IsAvailable
                    ?await TableStorage.FetchLogsAsync(account.Accountname, account.AccountKey, TileUpdater.RetrieveFilter())
                    :null;

            [...]
        }
        catch(Exception) {
           //Debugger doesn't break here 
        }
    }
}

благодаря

1
добавлено отредактировано
Просмотры: 2
nl ja de
У меня есть код в моем блоке catch ... Но он даже не вступает в это ...
добавлено автор WoIIe, источник
Довольно нормально, с тем, что вы отправили в любом случае. Документируйте код в блоке catch лучше. Имеются ли какие-либо наблюдаемые побочные эффекты? Используйте Debug + Exceptions, брошенный флажок для отладки.
добавлено автор Hans Passant, источник
Если ваш блок catch на самом деле пуст, тогда я не удивлюсь, если отладчик не перейдет в него. Попробуйте добавить «бросок»; и наложил на него точку останова.
добавлено автор Stephen Cleary, источник

1 ответы

Ваш метод InstantSchedule - async void и возвращает элемент управления Run сразу после вызова FetchLogsAsync . В результате, он переходит к выражению catch, но после завершения Run .

Вы должны сделать метод InstantSchedule как Task и await на нем:

public async void Run(IBackgroundTaskInstance taskInstance) {
    var defferal=taskInstance.GetDeferral();
    await InstantSchedule();
    defferal.Complete();
}

public static async Task InstantSchedule() {
        [...]
}

Обратите внимание, что метод Run также должен быть async .

0
добавлено