Jef*_*eff 1 c# ado.net asynchronous winforms async-await
我正在修改旧的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;
}
Run Code Online (Sandbox Code Playgroud)
这甚至是正确的方法吗?
我发现,如果我注释掉整个等待cnx.Query ...行,只需调用AddMyTableRow(dummyData)就行了.我觉得有某种异步/线程/上下文正在发生,但由于它没有产生任何类型的错误或异常,我不知道该怎么做.
干杯,杰夫
您可以使用async方法返回async,然后在异步形式的Task<DataTable>事件处理程序中或在您要执行数据绑定的async方法中,等待调用它,然后使用结果绑定到网格.
例
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;
}
Run Code Online (Sandbox Code Playgroud)
要了解如何在上面显示加载动画Load,请查看此文章.
| 归档时间: |
|
| 查看次数: |
3691 次 |
| 最近记录: |