C#-循环赢了';t停止(每次迭代开始新任务)

C#-循环赢了';t停止(每次迭代开始新任务),c#,multithreading,for-loop,task-parallel-library,C#,Multithreading,For Loop,Task Parallel Library,因此,我有一个基本的解决方案来解决用餐哲学家的问题,如下所示: using System; using System.Threading.Tasks; namespace Conductor { class Program { private static object _locker = new object(); static void Main(string[] args) { object[]

因此,我有一个基本的解决方案来解决用餐哲学家的问题,如下所示:

using System;
using System.Threading.Tasks;

namespace Conductor
{
    class Program
    {
        private static object _locker = new object();

        static void Main(string[] args)
        { 
            object[] sticks = {new object(),
                               new object(),
                               new object(),
                               new object(),
                               new object()};

            for (int i = 0; i<5; i++)
            {
                int next = (i + 1) % 5;
                Task.Factory.StartNew(() => Eat(sticks[i], sticks[next], i)); 
            }
        }

        static void Eat(object _leftChopstick, object _rightChopstick, int i)
        {
            lock (_locker)
            {
                lock (_leftChopstick)
                {
                    lock (_rightChopstick)
                    {
                        Console.WriteLine("Eating" + i);
                    }
                }
            }
        }
    }
}
此外,如果我通过循环进行调试,我会得到相同的异常

在此方面的任何帮助都将不胜感激。抱歉,如果它太基本,或者如果我的代码中有一些我错过的小缺陷。谢谢。

(inti=0;i<5;i++)
for (int i = 0; i < 5; i++)
            {
                int j = i;
                int next = (i + 1) % 5;
                Task.Factory.StartNew(() => Eat(sticks[j], sticks[next], j));
            }
{ int j=i; int next=(i+1)%5; Task.Factory.StartNew(()=>Eat(sticks[j],sticks[next],j)); }
使用调试器并逐步完成代码。。不要仅仅是编写代码并运行,意思是编写代码并启动应用程序,希望有
零错误。。是的,我也这样做了。我已经编辑了我的答案来说明这一点。无论如何,干杯。问题在于当涉及Task.Factory时,对
i
的引用范围发生了变化。通过将局部变量指定为仅由单个目标流程使用,可以避免更高范围的变量被外部因素修改的风险。
for (int i = 0; i < 5; i++)
            {
                int j = i;
                int next = (i + 1) % 5;
                Task.Factory.StartNew(() => Eat(sticks[j], sticks[next], j));
            }