Xamarin Firestore 在经过一段时间后抛出 TimeoutException

问题描述

需要一些关于如何在经过一段时间后抛出 TimeoutException 的建议,并且由于互联网丢失或任何其他意外问题,将数据发送到我的 fireStore 数据库方法仍未完成。

使用 f-Miyu 的 Plugin.CloudFirestore 插件

向服务器发送数据的代码

    public async Task BackUpNotes(UserNotes n)
    {
        await CrossCloudFirestore.Current.Instance.Collection(FTxts.Notes).Document(n.ID)
                .SetAsync(new {
                    n.ID,n.Title,n.Details,n.CreatedDate,n.Isstarred,n.LastEditDate,});
    }

//调用这里

    private async Task BackUpNotes()
    {
        if (IsBusy) return;
        IsBusy = true;
        int c = 0;
        var answer = await Application.Current.MainPage.displayAlert("Confirmation","Back Up Current Notes?","Yes","No");
        if (answer)
        {
            foreach (var item in NotesCollection)
            {
                await CloudService.CS.BackUpNotes(item);
                item.IsBackedUp = true;
                await PlannerDataService.UpdateNote(item);
                c++;
                ToastMessageShort($"{c}/{NotesCollection.Count} Saved");
            }
            await GetNotes();
        }
        IsBusy = false;
    }

解决方法

该库似乎不支持取消任务,您可以使用一个技巧来添加超时,例如:

var delayTask = Task.Delay(5000); // time out after 5 seconds
var backUpNotesTask = BackUpNotes(notes);

await Task.WhenAny(new [] { delayTask,backUpNotesTask });

当这些任务中的第一个完成时,此代码将继续。这可能是“超时”delayTaskbackUpNotesTask

如果您想在第一个返回的任务不是 backUpNotesTask 时抛出异常,您可以检查 WhenAny 的结果:

var winner = await Task.WhenAny(...

if (winner == delayTask)
    throw new TimeoutException();

请记住,这并不意味着 BackUpNotes 不会稍后完成