【问题标题】:Load data asynchronously into DataTable in Windows Forms将数据异步加载到 Windows 窗体中的 DataTable 中
【发布时间】:2016-11-20 12:05:46
【问题描述】:

我正在修改旧 WinForms/ADO 应用程序的数据访问层,以通过异步 developerforce rest api 使用 soql 获取 Salesforce 对象。以下方法通常有效,除了我的 13 个表例程之一永远不会从 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) 就可以了。我觉得有某种异步/线程/上下文正在发生,但由于它没有产生任何类型的错误或异常,我不知道该怎么办。

干杯, 杰夫

【问题讨论】:

  • ADO.NET 类不是线程安全的。如果您尝试同时从 3 个线程更新相同的 DataTable,所有地狱都会崩溃。 DataTable and thread safety

标签: c# winforms asynchronous ado.net async-await


【解决方案1】:

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

示例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多