0

我有一个带有多个选项卡的 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
}

但是,用户界面仍在等待从数据库中获取数据......有什么想法吗?

4

3 回答 3

5

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

当异步加载数据时,你需要为你的 UI 设计一个“加载”状态,并在加载完成时更新它。我有另一个关于异步构造/初始化的博客文章,您可能会觉得它很有用,特别是我的NotifyTaskCompletion类型试图使任务对数据绑定更加友好。

于 2013-07-26T14:56:13.053 回答
2
return GetCaseNotesAsync(debtorId).Result;

应该

return await GetCaseNotesAsync(debtorId);

当您调用ResultaTask时,您会同步等待结果,而不是异步。

于 2013-07-26T14:55:44.880 回答
0

因为您有异步方法但同步调用它。在没有 await 的情况下调用 Async 方法将导致它表现为同步方法

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

 return await GetCaseNotesAsync(debtorId);
于 2013-07-26T14:55:52.530 回答