使用Task加载数据仍会挂起UI

时间:2013-07-26 14:52:42

标签: c# asynchronous async-await

我有一个带有几个标签的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仍在等待从数据库中获取数据......有什么想法吗?

3 个答案:

答案 0 :(得分:5)

Result将阻止,直到任务完成。您已使用ConfigureAwait避开deadlock I describe on my blog,但仍然明确阻止。

异步加载数据时,您需要为UI设置“加载”状态,并在加载完成时更新它。我在asynchronous construction/initialization上有另一个博客条目,您可能会觉得有用,特别是我的NotifyTaskCompletion type尝试使任务更加数据绑定友好。

答案 1 :(得分:2)

return GetCaseNotesAsync(debtorId).Result;

应该是

return await GetCaseNotesAsync(debtorId);

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

答案 2 :(得分:0)

因为你有异步方法但是同步调用它。 在没有等待的情况下调用Async方法将使其表现为同步方法

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

 return await GetCaseNotesAsync(debtorId);