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