有一个任务:从 DataTable 中的 DB 表中加载数据。由于数据量很大,而且服务器很周到,我将使用异步方法,但由于某种原因,没有任何效果。有这个代码:
public void LoadData()
{
LoadDataAsync();
}
protected async Task LoadDataAsync()
{
// какой-то подготавливающий код - неинтересные, скучные подробности
await _dataAdapter.Fill(_dataTable);
// другой код, установка переменных и прочие действия
}
在 LoadData() 调用之后,LoadDataAsync() 方法的第二部分根本不执行,而是将执行转移到调用 LoadData() 的函数。所以桌子是空的。像这样尝试:
public async void LoadData()
{
await LoadDataAsync();
}
我创建了任务并通过 Run with await 和 await Task.WhenAll(t) 在这两种方法中调用它们,一个是使用 async 前缀完成的,另一个不是,我尝试了它们的不同组合。到目前为止,达到了以下预期:
public void LoadData()
{
Task _res = Task.Run(LoadDataAsync);
Task.WaitAll(_res);
}
LoadDataAsync() 的代码如上所示。
因此,问题是:如何正确加载数据,从而没有阻塞并组织等待数据加载到内存中的过程?
谢谢
由于在执行构造函数时与未完全初始化的窗口相关的各种限制,您无法将自己的代码插入构造函数。
Window.Loaded使用事件及其处理程序代替构造函数,您可以立即在其中使用异步。将所有代码从构造函数移至事件处理程序
Window.Loaded,在构造函数中只留下本机代码InitializeComponent()。另请阅读这篇文章。
如果您只想开始并行下载,那么这可以在没有异步的情况下完成,而只需启动一个任务。
称呼