如何避免捕获变量?

Jad*_*ias 6 .net c# concurrency delegates captured-variable

我遇到了问题

foreach(var category in categories)
{
    foreach(var word in words)
    {
        var waitCallback = new WaitCallback(state =>
        {
            DoSomething(word, category);
        });

        ThreadPool.QueueUserWorkItem(waitCallback);
    }
}
Run Code Online (Sandbox Code Playgroud)

DoSomething执行get时,它会接收每个捕获变量的最新值,而不是我想要的值.我可以想象一个解决方案,但它想象你们可以提出更好的解决方案

Hei*_*nzi 13

解决此问题的规范方法是将值复制到在循环声明的临时变量中.

foreach(var category in categories)
{
    var catCopy = category;
    foreach(var word in words)
    {
        var wordCopy = word;
        var waitCallback = new WaitCallback(state =>
        {
            DoSomething(wordCopy, catCopy);
        });

        ThreadPool.QueueUserWorkItem(waitCallback);
    }
}
Run Code Online (Sandbox Code Playgroud)