【问题标题】:Adding Tables to dataset by multiple threads is thread safe?通过多个线程将表添加到数据集是线程安全的吗?
【发布时间】:2017-08-16 13:26:07
【问题描述】:

是 通过多线程向数据集添加表是线程安全的吗?

    List<Action> TestActions = new List<Action>();

    Action action1 = new Action(() => Method1(dsDataset));
    TestActions.Add(action1);

    Action action2 = new Action(() => Method2(dsDataset));
    TestActions.Add(action2);

    Action action3 = new Action(() => Method3(dsDataset));
    TestActions.Add(action3);

    try
    {
        Parallel.ForEach(TestActions, (a) => a());
    }

    Method1(DataSet ds) {
    //excecute a db call and returns  datatable
    Datatable db ={database query}
    ds.Tables.Add(db)
    }
            Method2(DataSet ds) {
    //excecute a db call and returns  datatable
    Datatable db ={database query}
    ds.Tables.Add(db)
    }
            Method3(DataSet ds) {
    //excecute a db call and returns  datatable
    Datatable db ={database query}
    ds.Tables.Add(db)
    }

上面的代码是否有效,或者我需要在每个线程尝试添加时锁定数据集? 有没有更好的办法?

【问题讨论】:

    标签: multithreading thread-safety dataset parallel.foreach


    【解决方案1】:

    来自official documentation

    这种类型对于多线程读取操作是安全的。您必须同步所有写入操作。

    所以,答案是:不,这不安全。在单个线程中使用同步或添加表。
    只是好奇,为什么需要并行执行?

    如果是因为某些工作必须并行完成,并且由于这项工作需要在 ds 中添加一个表,我可以推荐使用一个 ConcurrentQueue 来存储表和一个工作线程,这将从该队列中挑选项目并将它们添加到 ds。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      相关资源
      最近更新 更多