将多个参数传递给任务

时间:2014-07-11 00:41:48

标签: c# task-parallel-library blockingcollection

我希望将两个BlockingCollection<>传递给一个任务。我试图将它们放在一个对象数组中并传递它们但它不起作用。谁能帮我这个?我试图传递值的代码如下:

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

1 个答案:

答案 0 :(得分:2)

您正在使用StartNew的following重载:

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