我有一个处理多个Google Analytics报告的功能。收到数据后,我将JSON转换为DataTable。 我通过执行以下操作并行处理响应
DataSet ds = new DataSet();
/*Begin of Run Tasks Block*/
tTaskList.Add(Task.Run(async () =>
{
/*All DataTable Logic here...*/
//(...)
if (dt.Rows.Count > 0)
{
//Checks if table belongs to ds, if yes merge with the existing table, adds otherwise
if (ds.Tables.Contains(dt.TableName))
{
ds.Tables[dt.TableName].Merge(dt);
}
else
{
ds.Tables.Add(dt);
}
}
}
Task.WaitAll(tTaskList.ToArray());
//Saves all dts in dataset to file
Business.Common.ExportDataToCsv(ds, Path.Combine(Google.Common.Configuration.FilePath.DownloadsPath));
它在我的日志中给出了以下错误:
[2017-04-21 10:23:40] [Google Analytics] [ERROR] [MoveNext] A DataTable named 'Geographics' already belongs to this DataSet.
但是这不应该发生,因为我有一个if
子句来验证是否有一个具有该名称的表,如果是,它应该合并,而不是添加一个新的。
这可能需要在任务写入时阻止对象的东西,但是我没有找到适合我的示例。
答案 0 :(得分:0)
你需要在写作时锁定你的对象。
lock(ds)
{
if (dt.Rows.Count > 0)
{
//Checks if table belongs to ds, if yes merge with the existing table, adds otherwise
if (ds.Tables.Contains(dt.TableName))
{
ds.Tables[dt.TableName].Merge(dt);
}
else
{
ds.Tables.Add(dt);
}
}
}