将数据异步加载到Windows窗体中的DataTable中

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

public void LoadData() { var tasks = new List<Task> { GetObject1Async(), GetObject2Async(),... GetObject13Async() }; Task.WaitAll(tasks.ToArray()); //do some postprocessing now that I have all the data } async Task GetObject1Async(){ var response = await cnx.QueryAsync("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; } 

这甚至是正确的方法吗?

我发现,如果我注释掉整个等待cnx.Query …行,只需调用AddMyTableRow(dummyData)就行了。 我觉得有某种异步/线程/上下文正在发生,但由于它没有产生任何类型的错误或exception,我不知道该怎么做。

干杯,杰夫

您可以使用async方法返回Task ,然后以异步formsLoad事件处理程序,或者在要执行数据绑定的async方法中,等待调用它,然后使用结果绑定到网格。

 public async Task GetDataAsync() { var dt = new DataTable(); var cn = @"Your Connection String"; var cmd = @"SELECT * FROM Category"; var da = new SqlDataAdapter(cmd, cn); await Task.Run(() => { da.Fill(dt); }); return dt; } private async void Form1_Load(object sender, EventArgs e) { var data = await GetDataAsync(); this.dataGridView1.DataSource = data; }