C# 向任务传递多个参数

C# 向任务传递多个参数,c#,task-parallel-library,blockingcollection,C#,Task Parallel Library,Blockingcollection,我希望将两个BlockingCollections传递给一个任务。我试着把它们放在一个对象数组中并传递它们,但没有成功。有人能帮我吗?我试图传递值的代码如下所示: var lineHolders = new[] { new BlockingCollection<string>(linesCapacity), new BlockingCollection<string>(linesCapacity), new BlockingCollectio

我希望将两个
BlockingCollection
s传递给一个任务。我试着把它们放在一个对象数组中并传递它们,但没有成功。有人能帮我吗?我试图传递值的代码如下所示:

var lineHolders = new[]
{
     new BlockingCollection<string>(linesCapacity),
     new BlockingCollection<string>(linesCapacity),
     new BlockingCollection<string>(linesCapacity),
     new BlockingCollection<string>(linesCapacity)
};

var chunksHolder = new[]
{
     new BlockingCollection<List<BsonDocument>>(chunksCapacity),
     new BlockingCollection<List<BsonDocument>>(chunksCapacity)
};

for (var processors = 0; processors < 16; processors++)
{
      var myLineHolder = lineHolders[processors%lineHolders.Length];
      var myChunkHolder = chunksHolder[processors%chunksHolder.Length];
      processorTaskArray[processors] = Task.Factory.StartNew((arg) =>
      {
          var lines = (BlockingCollection<string>) arg[0];  // compiler generates error here
          var chunks = (BlockingCollection<List<BsonDocument>>) arg[1]; // compiler generates error here

          // perform my work...


      },
      new object []
      {
          myLineHolder, 
          myChunkHolder
      });
}
var lineHolders=new[]
{
新BlockingCollection(linesCapacity),
新BlockingCollection(linesCapacity),
新BlockingCollection(linesCapacity),
新BlockingCollection(linesCapacity)
};
var chunksHolder=new[]
{
新BlockingCollection(chunksCapacity),
新BlockingCollection(chunksCapacity)
};
对于(变量处理器=0;处理器<16;处理器++)
{
var myLineHolder=lineHolders[处理器%lineHolders.Length];
var myChunkHolder=chunksHolder[处理器%chunksHolder.Length];
processorTaskArray[processors]=Task.Factory.StartNew((arg)=>
{
var lines=(BlockingCollection)arg[0];//编译器在此处生成错误
var chunks=(BlockingCollection)arg[1];//编译器在此处生成错误
//执行我的工作。。。
},
新对象[]
{
myLineHolder,
myChunkHolder
});
}
您正在使用StartNew的重载:

public Task StartNew(
    Action<Object> action,
    Object state
)
公共任务开始新建(
行动行动,
对象状态
)
因为它只是一个对象,所以不能对其应用索引。投下它,它会很好地工作

for (var processors = 0; processors < 16; processors++)
        {
            var myLineHolder = lineHolders[processors % lineHolders.Length];
            var myChunkHolder = chunksHolder[processors % chunksHolder.Length];
            processorTaskArray[processors] = Task.Factory.StartNew((arg) =>
            {
                var properArg = (object[]) arg;
                var lines = (BlockingCollection<string>) properArg[0]; // compiler generates error here
                var chunks = (BlockingCollection<List<BsonDocument>>) properArg[1]; // compiler generates error here

                // perform my work...

            },
            new object[]
              {
                  myLineHolder, 
                  myChunkHolder
              });
        }
for(变量处理器=0;处理器<16;处理器++)
{
var myLineHolder=lineHolders[处理器%lineHolders.Length];
var myChunkHolder=chunksHolder[处理器%chunksHolder.Length];
processorTaskArray[processors]=Task.Factory.StartNew((arg)=>
{
var properArg=(object[])arg;
var lines=(BlockingCollection)properArg[0];//编译器在此处生成错误
var chunks=(BlockingCollection)properArg[1];//编译器在此处生成错误
//执行我的工作。。。
},
新对象[]
{
myLineHolder,
myChunkHolder
});
}

var line=lineholder[0];特定任务的lines BlockingCollection取决于循环索引处理器。无法执行占线符[0]。编译器错误是什么?在循环中引入新的int变量以捕获迭代索引器,然后在任务中使用它,然后可以在任务中处理mylineholder和mychunckholder。编译器错误是:
无法对“object”类型的表达式应用索引。
。是否需要在循环中捕获局部变量还是仅仅是循环变量本身?我的理解是,如果您在StartNew中引用处理器,您将得到一个对不断变化的循环变量的引用,结果将是意外的。但是循环中的局部变量呢?如果在processors=0时捕获对myLineHolder的引用,那么下次循环中的引用是对同一变量的引用吗?当然不是?