gpt4 book ai didi

c# - 在 Windows 窗体中将数据异步加载到 DataTable

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:21 26 4
gpt4 key购买 nike

我正在修改旧 WinForms/ADO 应用程序的数据访问层,以通过异步 developerforce rest api 使用 soql 获取 Salesforce 对象。以下方法通常有效,除了我的十三个表例程之一永远不会从 AddMyTableRow (System.Data.DataRowCollection.Add()) 方法返回:

public void LoadData() {
var tasks = new List<Task<int>> {
GetObject1Async(),
GetObject2Async(),...
GetObject13Async()
};
Task.WaitAll(tasks.ToArray());
//do some postprocessing now that I have all the data
}

async Task<int> GetObject1Async(){
var response = await cnx.QueryAsync<dynamic>("SELECT foo FROM bar").ConfigureAwait(false);
foreach (var rec in response.Records){
var row = MyDataSet.MyTable.NewMyTableRow();
row.Name = rec.Name; ...
MyDataSet.MyTable.AddMyTableRow(row); //<== Sometimes this never returns
}
return MyDataSet.MyTable.Count;
}

这是正确的方法吗?

我发现,如果我注释掉整个 await cnx.Query... 行并仅调用 AddMyTableRow(dummyData) 它就可以工作。我觉得有某种异步/线程/上下文正在发生,但由于它没有产生任何类型的错误或异常,我不知道该怎么办。

干杯,杰夫

最佳答案

你可以有一个 async 返回 Task<DataTable> 的方法然后以异步形式 Load事件处理程序或要执行数据绑定(bind)的异步方法中,等待调用它,然后使用结果绑定(bind)到网格。

示例

public async Task<DataTable> GetDataAsync(string command, string connection)
{
var dt = new DataTable();
using (var da = new SqlDataAdapter(command, connection))
await Task.Run(() => da.Fill(dt));
return dt;
}

private async void Form1_Load(object sender, EventArgs e)
{
var command = @"SELECT * FROM Category";
var connection = @"Your Connection String";
var data = await GetDataAsync(command, connection);
this.dataGridView1.DataSource = data;
}

查看如何在 DataGridView 上显示加载动画,看看this post .

关于c# - 在 Windows 窗体中将数据异步加载到 DataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38427282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com