gpt4 book ai didi

c# - 异步数据加载及后续错误处理

转载 作者:行者123 更新时间:2023-11-30 22:08:46 24 4
gpt4 key购买 nike

我有一个涉及数据库的应用程序。以前,在打开一个窗口时,我会查询数据库并使用它来填充我的 View 模型的各个方面。这工作得相当好,但当数据访问花费的时间比预期长时,​​可能会造成明显的暂停。

当然,自然的解决方案是异步运行数据库查询,然后在该查询完成时填充 View 模型。这并不太难,但它提出了一些关于错误处理的有趣问题。

以前,如果数据库查询出现问题(当然是一个相当大的问题),我会通过 View 模型构造函数传播异常,最终将其返回到想要打开窗口的调用者。然后它可以显示适当的错误,而不是实际打开窗口。

但是,现在窗口会立即打开,然后在查询完成后填充。现在的问题是我应该在什么时候检查后台任务中的错误?窗口已经打开,因此行为需要以某种方式有所不同,但是向用户指示失败并允许正常恢复/关闭的简洁方法是什么?

作为引用,下面是演示基本模式的片段:

    public ViewModel()
{
_initTask = InitAsync();
//Now where do I check on the status of the init task?
}

private async Task InitAsync()
{
//Do stuff...
}

//....

public void ShowWindow()
{
var vm = new ViewModel(); //Previously this could throw an exception that would prevent window from being shown
_windowServices.Show(vm);
}

我考虑过的一个选项是使用异步工厂方法来构建 ViewModel,从而允许在尝试显示窗口之前构建和初始化整个对象。这保留了在窗口打开之前报告错误的旧方法。但是,它放弃了通过这种方法获得的一些 UI 响应能力,这允许窗口的初始加载与查询并行发生,并且还允许我(在某些情况下)在每个查询完成时以增量方式更新 UI,而不是而不是让 UI 一次组合起来。它避免锁定 UI 线程,但不会减少用户实际看到窗口并开始与之交互之前的时间。

最佳答案

也许在您的 View 模型和底层服务之间使用某种消息传递/中介?

使用MVVMLight的半伪代码

public ViewModel()
{
Messenger.Default.Register<NotificationMessage<Exception>>(this, message =>
{
// Handle here
});

Task.Factory.StartNew(() => FetchData());
}

public async Task FetchData()
{
// Some magic happens here
try
{
Thread.Sleep(2000);
throw new ArgumentException();
}
catch (Exception e)
{
Messenger.Default.Send(new NotificationMessage<Exception>(this, e, "Aw snap!"));
}
}

关于c# - 异步数据加载及后续错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com