C#在多线程环境中写入相同的数据集

时间:2017-04-21 09:30:30

标签: c# multithreading

我有一个处理多个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子句来验证是否有一个具有该名称的表,如果是,它应该合并,而不是添加一个新的。

这可能需要在任务写入时阻止对象的东西,但是我没有找到适合我的示例。

1 个答案:

答案 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);
        }
    }
}