相关疑难解决方法(0)

ConcurrentBag - 添加多个项目?

有没有办法一次向ConcurrentBag添加多个项目,而不是一次添加一个?我没有在ConcurrentBag上看到AddRange()方法,但是有一个Concat().但是,这对我不起作用:

ConcurrentBag<T> objectList = new ConcurrentBag<T>();

timeChunks.ForEach(timeChunk =>
{
    List<T> newList = Foo.SomeMethod<T>(x => x.SomeReadTime > timeChunk.StartTime);
    objectList.Concat<T>(newList);
});
Run Code Online (Sandbox Code Playgroud)

这段代码曾经在Parallel.ForEach()中,但我把它改成了上面所以我可以解决它.变量newList确实有对象,但是在objectList.Concat <>行之后,objectList总是有0个对象.Concat <>不能那样工作吗?我是否需要使用Add()方法一次一个地向ConcurrentBag添加项目?

c# concurrency concurrent-collections

35
推荐指数
4
解决办法
2万
查看次数

使用Parallel.ForEach的Azure TableQuery线程安全性

我有一些基本的Azure表,我一直在串行查询:

var query = new TableQuery<DynamicTableEntity>()
  .Where(TableQuery.GenerateFilterCondition("PartitionKey",
    QueryComparisons.Equal, myPartitionKey));

foreach (DynamicTableEntity entity in myTable.ExecuteQuery(query)) {
  // Process entity here.
}
Run Code Online (Sandbox Code Playgroud)

为了加快速度,我将其并行化:

Parallel.ForEach(myTable.ExecuteQuery(query), (entity, loopState) => {
  // Process entity here in a thread-safe manner.

  // Edited to add: Details of the loop body below:

  // This is the essence of the fixed loop body:
  lock (myLock) {
    DataRow myRow = myDataTable.NewRow();
    // [Add entity data to myRow.]
    myDataTable.Rows.Add(myRow);
  }

  // Old code (apparently not thread-safe, though NewRow() is supposed to …
Run Code Online (Sandbox Code Playgroud)

c# azure parallel-extensions azure-table-storage

8
推荐指数
1
解决办法
706
查看次数

Guid.NewGuid() 在 Parallel.For 循环中使用时返回重复值

我有一个正在访问 API 的应用程序。因此,它对对象中的所有 ID 进行查询,然后必须对每个 ID 一次查询一个项目。我在 Parallel.For 循环中执行此操作并将每个项目数据添加到数据表中的一行。然后我使用 sqlbulkcopy 将数据表发送到 SQL 服务器表。

如果我在不使用 Parallel.For 的情况下执行此操作,则效果很好。但是,对于 Parallel.For,这一行:

workrow["id"] = Guid.NewGuid();
Run Code Online (Sandbox Code Playgroud)

正在生成重复的 Guid。它经常这样做并导致数据无法加载到 SQL 服务器表中,因为 SQL 中的 id 行是主键并且不允许重复。我尝试锁定:

                    lock (lockobject)
                    {
                        workrow["id"] = Guid.NewGuid();
                    }
Run Code Online (Sandbox Code Playgroud)

这没有帮助。
我尝试不为该字段分配一个 id,希望 SQL 会生成它(它在该字段上确实有 newid())。说它不能插入空值失败了。我似乎不能只是从数据表中删除 id 字段,因为当我执行 sqlbulkcopy 时,列不会对齐。

有人可以在这里帮助我吗?我要么需要弄清楚如何让 Guid.NewGuid() 停止生成重复项,要么我需要找出一种不传入 id(始终是数据表中的第一个字段)的方法,以便 SQL 生成 id。

这是我用来生成表之一的代码:

        public static DataTable MakeWorkflowTable()
        {
            DataTable Workflow = new DataTable("Workflow");
            DataColumn id = new DataColumn("id", System.Type.GetType("System.Guid"));
            Workflow.Columns.Add(id);
            DataColumn OrgInfoID = new DataColumn("OrgInfoID", System.Type.GetType("System.Guid"));
            Workflow.Columns.Add(OrgInfoID);
            DataColumn Name = …
Run Code Online (Sandbox Code Playgroud)

c# sql-server multithreading guid sqlbulkcopy

4
推荐指数
1
解决办法
884
查看次数