【发布时间】: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