Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在for循环中启动任务:意外行为_C#_Multithreading_For Loop_C# 4.0_Task - Fatal编程技术网

C# 在for循环中启动任务:意外行为

C# 在for循环中启动任务:意外行为,c#,multithreading,for-loop,c#-4.0,task,C#,Multithreading,For Loop,C# 4.0,Task,我正在学习C#中的多线程。这让我很难理解,所以我正在做一些简单的程序来更好地理解它 我意识到如果我有: static void Main() { Task[] tasks = new Task[4]; for (int i = 0; i < 4; i++) { tasks[i] = Task.Factory.StartNew(() => { Console.Write

我正在学习C#中的多线程。这让我很难理解,所以我正在做一些简单的程序来更好地理解它

我意识到如果我有:

   static void Main()
    {
        Task[] tasks = new Task[4];
        for (int i = 0; i < 4; i++)
        {
            tasks[i] = Task.Factory.StartNew(() => {
                Console.WriteLine(i);
            });
        }
        Console.ReadKey();
    }

制作一个局部变量-将值复制到其中,您应该会得到预期的输出:

static void Main()
{
    Task[] tasks = new Task[4];
    for (int i = 0; i < 4; i++)
    {
        int x = i;
        tasks[x] = Task.Factory.StartNew(() => {
            Console.WriteLine(x);
        });
    }
    Console.ReadKey();
}
static void Main()
{
任务[]任务=新任务[4];
对于(int i=0;i<4;i++)
{
int x=i;
tasks[x]=Task.Factory.StartNew(()=>{
控制台写入线(x);
});
}
Console.ReadKey();
}

您获得意外输出的原因是
i
被共享

创建一个局部变量-将值复制到其中,您应该会得到预期的输出:

static void Main()
{
    Task[] tasks = new Task[4];
    for (int i = 0; i < 4; i++)
    {
        int x = i;
        tasks[x] = Task.Factory.StartNew(() => {
            Console.WriteLine(x);
        });
    }
    Console.ReadKey();
}
static void Main()
{
任务[]任务=新任务[4];
对于(int i=0;i<4;i++)
{
int x=i;
tasks[x]=Task.Factory.StartNew(()=>{
控制台写入线(x);
});
}
Console.ReadKey();
}

您获得意外输出的原因是
i
被共享

谢谢你的回答,萨迪克。但问题是为什么会出现这种行为,而不是我所想的行为?@PabloDeLuca-请看我的编辑。也请看我的编辑。@PabloDeLuca-原因是数据竞争-您试图避免使用睡眠。修改共享变量而不锁定总是会导致意外结果。看这里:谢谢。我真的不知道。谢谢你的回答,萨迪克。但问题是为什么会出现这种行为,而不是我所想的行为?@PabloDeLuca-请看我的编辑。也请看我的编辑。@PabloDeLuca-原因是数据竞争-您试图避免使用睡眠。修改共享变量而不锁定总是会导致意外结果。看这里:谢谢。我真的不知道,“为什么在添加这行代码时不会出现这种可能由clousures引起的行为”-因为您现在在循环的每次迭代之间等待500毫秒,从而允许
任务在捕获的变量上运行到完成,然后循环的下一次迭代更新相同的变量。“为什么在添加这行代码时,不会出现由clousures引起的这种行为”-因为您现在在循环的每次迭代之间等待500毫秒,因此在循环的下一次迭代更新相同的变量之前,允许
任务在捕获的变量上运行到完成。