使用任务加载数据仍然挂起UI
本文关键字:挂起 UI 数据 任务 加载 | 更新日期: 2023-09-27 18:25:00
我有一个WPF表单,在中有几个选项卡。当我加载表单时,我还试图在后台加载一些选项卡的数据。
代码如下:
public static List<MyModel> GetCaseNotes(int someId)
{
return GetCaseNotesAsync(debtorId).Result;
}
public static async Task<List<MyModel>> GetCaseNotesAsync(int someId)
{
Task<List<MyModel>> tsk = Task.Run(() => GetCaseNotesFromDb(someId));
return await tsk.ConfigureAwait(false);
}
public static List<MyModel> GetCaseNotesFromDb(int debtorId)
{
//get some data from database
}
然而,UI仍在等待从数据库中获取数据。。。有什么想法吗?
Result
将阻塞,直到任务完成。您已经通过使用ConfigureAwait
避免了我在博客中描述的死锁,但您仍然显式地阻止。
异步加载数据时,您需要为UI设计一个"加载"状态,并在加载完成时对其进行更新。我还有另一篇关于异步构造/初始化的博客文章,您可能会发现它很有用,特别是我的NotifyTaskCompletion
类型试图使任务更易于数据绑定。
return GetCaseNotesAsync(debtorId).Result;
应该是
return await GetCaseNotesAsync(debtorId);
当您在Task
上调用Result
时,您会同步等待结果,而不是异步等待。
因为您有异步方法,但同时调用它在没有等待的情况下调用Async方法将导致其表现为同步方法。
为了异步调用它,你应该像这样调用
return await GetCaseNotesAsync(debtorId);