我正在使用C#进行异步编程,并且将循环计数器'i'作为参数传递给Task的Run方法中,以使其异步运行。一切工作正常,只是每一个任务中的循环计数器“ i”在调用者中递增时都会更新。换句话说,“ i”不保留其值,我不确定如何解决该问题。
//A queue for all the tasks
var tasks = new BlockingCollection<Task<ResultWrapper>>();
for (int i = 1; i <= 10; i++)
{
Console.WriteLine("frame: " + i);
//Grab a frame
Bitmap frame = reader.ReadVideoFrame(i);
//Add the frames to the queue and run them asynchronously
tasks.Add(Task.Run(() => RequestAnalysis(projectId, endpoint, frame, i)));
}
这是RequestAnalysis()函数的代码:
private static ResultWrapper RequestAnalysis(Guid projectId, PredictionEndpoint endpoint, Bitmap frame, int i)
{
Console.WriteLine("Frame {0} task is running", i);
//some other stuff here...
}
以下是示例输出:
frame: 1
frame: 2
frame: 3
frame: 4
frame: 5
Frame 3 task is running
Frame 3 task is running
frame: 6
Frame 4 task is running
frame: 7
frame: 8
frame: 9
Frame 5 task is running
frame: 10
Frame 11 task is running
Frame 11 task is running
Frame 11 task is running
Frame 11 task is running
Frame 11 task is running
Frame 11 task is running
但是我希望它是这样的:
frame: 1
frame: 2
frame: 3
frame: 4
frame: 5
Frame 1 task is running
Frame 2 task is running
frame: 6
Frame 3 task is running
frame: 7
frame: 8
frame: 9
Frame 4 task is running
frame: 10
Frame 5 task is running
Frame 6 task is running
Frame 7 task is running
Frame 8 task is running
Frame 9 task is running
Frame 10 task is running
我将不胜感激。我是C#的新手,我不确定自己缺少什么。
谢谢。
答案 0 :(得分:0)
将lambda绑定到一个不变的变量。例如:
int currentIndex = i;
tasks.Add(Task.Run(() => RequestAnalysis(projectId, endpoint, frame, currentIndex)));