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

Моя проблема заключается в том, что если я отлаживаю фоновую задачу моего 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
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
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Про Windows
Про Windows
941 участник(ов)

Microsoft Windows и всё, что с этим связано. Список интересных групп и каналов: https://github.com/goq/telegram-list

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot