Search code examples
c#task-parallel-libraryblockingcollection

Pass multiple parameters to a task


I wish to pass two BlockingCollection<>s to a task. I tried to put them in an object array and pass them but it doesn't work. Can anyone help me with this? The code where i am trying to pass the values is written below:

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

Solution

  • You're using the following overload of StartNew:

    public Task StartNew(
        Action<Object> action,
        Object state
    )
    

    Since it's just an object you can't apply indexing on it. Cast it and it will work fine.

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