使用任务加载数据仍然挂起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仍在等待从数据库中获取数据。。。有什么想法吗?

使用任务加载数据仍然挂起UI

Result将阻塞,直到任务完成。您已经通过使用ConfigureAwait避免了我在博客中描述的死锁,但您仍然显式地阻止。

异步加载数据时,您需要为UI设计一个"加载"状态,并在加载完成时对其进行更新。我还有另一篇关于异步构造/初始化的博客文章,您可能会发现它很有用,特别是我的NotifyTaskCompletion类型试图使任务更易于数据绑定。

return GetCaseNotesAsync(debtorId).Result;

应该是

return await GetCaseNotesAsync(debtorId);

当您在Task上调用Result时,您会同步等待结果,而不是异步等待。

因为您有异步方法,但同时调用它在没有等待的情况下调用Async方法将导致其表现为同步方法

为了异步调用它,你应该像这样调用

 return await GetCaseNotesAsync(debtorId);