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的引用,那么下次循环中的引用是对同一变量的引用吗?当然不是?