C# 如何同步多个线程

C# 如何同步多个线程,c#,multithreading,C#,Multithreading,我编写了这个控制台程序: static void Main(string[] args) { object sync = new object(); Thread[] t = new Thread[10]; int count = 0; for (var i = 0; i < t.Length; i++) { t[i] = new Thread(() => { lock (sync)

我编写了这个控制台程序:

static void Main(string[] args)
{
    object sync = new object();
    Thread[] t = new Thread[10];
    int count = 0;

    for (var i = 0; i < t.Length; i++)
    {
        t[i] = new Thread(() =>
        {
            lock (sync)
            {
                int inc = count;
                Console.WriteLine("Count: {0}", count);
                count = inc + 1;
            }
        });
    }

    foreach (var t1 in t)
    {
        t1.Start();
    }

    foreach (var t1 in t)
    {
        t1.Join();
        Console.WriteLine("\nFinal Count= {0}", count);
        Console.ReadKey();
    }
}
当我多次运行应用程序时,我会得到更多不同的结果 但我想看到这个结果:

Count: 0
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Count: 6
Count: 7
Count: 8
Count: 9

Final Count= 10

为什么它会返回不同的结果?我如何解决这个问题?

好的,而不是这个:

foreach (var t1 in t)
{
    t1.Join();
    Console.WriteLine("\nFinal Count= {0}", count);
    Console.ReadKey();
}
你应该写:

foreach (var t1 in t)
{
    t1.Join();

}
Console.WriteLine("\nFinal Count= {0}", count);
Console.ReadKey();

否则,您将有一个赛车和您的代码将是不确定的

好吧,而不是这个:

foreach (var t1 in t)
{
    t1.Join();
    Console.WriteLine("\nFinal Count= {0}", count);
    Console.ReadKey();
}
你应该写:

foreach (var t1 in t)
{
    t1.Join();

}
Console.WriteLine("\nFinal Count= {0}", count);
Console.ReadKey();

否则,您将有一个赛车和您的代码将是不确定的

好吧,而不是这个:

foreach (var t1 in t)
{
    t1.Join();
    Console.WriteLine("\nFinal Count= {0}", count);
    Console.ReadKey();
}
你应该写:

foreach (var t1 in t)
{
    t1.Join();

}
Console.WriteLine("\nFinal Count= {0}", count);
Console.ReadKey();

否则,您将有一个赛车和您的代码将是不确定的

好吧,而不是这个:

foreach (var t1 in t)
{
    t1.Join();
    Console.WriteLine("\nFinal Count= {0}", count);
    Console.ReadKey();
}
你应该写:

foreach (var t1 in t)
{
    t1.Join();

}
Console.WriteLine("\nFinal Count= {0}", count);
Console.ReadKey();

否则,您将有一个赛车和您的代码将是不确定的

尝试不要像这样手动创建/终止线程,这是一个耗时的操作,而且扩展性不好

使用
线程池


或者更好:使用任务,并通过使用
等待任务来同步它们。当所有(任务列表)

尝试时,不要像这样手动创建/终止线程,这是一个耗时的操作,而且扩展性不好

使用
线程池


或者更好:使用任务,并通过使用
等待任务来同步它们。当所有(任务列表)

尝试时,不要像这样手动创建/终止线程,这是一个耗时的操作,而且扩展性不好

使用
线程池


或者更好:使用任务,并通过使用
等待任务来同步它们。当所有(任务列表)

尝试时,不要像这样手动创建/终止线程,这是一个耗时的操作,而且扩展性不好

使用
线程池



或者更好:使用任务,并通过使用
等待任务来同步它们。当所有(任务列表)

确实-在编写原始代码时,一旦检测到任何一个线程已完成,就会显示“最终计数”。事实上,我很惊讶“Final count”消息只出现一次,因为我希望每个线程都能看到它一次……应该是这样的,但他在循环中有Console.ReadKey()。当然,程序甚至没有运行到完成*facepalm*确实如此——在编写原始代码时,一旦检测到任何一个线程已完成,“最终计数”就会显示出来。事实上,我很惊讶“Final count”消息只出现一次,因为我希望每个线程都能看到它一次……应该是这样的,但他在循环中有Console.ReadKey()。当然,程序甚至没有运行到完成*facepalm*确实如此——在编写原始代码时,一旦检测到任何一个线程已完成,“最终计数”就会显示出来。事实上,我很惊讶“Final count”消息只出现一次,因为我希望每个线程都能看到它一次……应该是这样的,但他在循环中有Console.ReadKey()。当然,程序甚至没有运行到完成*facepalm*确实如此——在编写原始代码时,一旦检测到任何一个线程已完成,“最终计数”就会显示出来。事实上,我很惊讶“Final count”消息只出现一次,因为我希望每个线程都能看到它一次……应该是这样的,但他在循环中有Console.ReadKey()。当然,程序甚至没有运行到完成*facepalm*
count=inc+1没有什么意义。发布实际代码。“最终计数”是可以实现的,但是如果您希望数字按顺序排列,那么就不要使用线程。
count=inc+1没有什么意义。发布实际代码。“最终计数”是可以实现的,但是如果您希望数字按顺序排列,那么就不要使用线程。
count=inc+1没有什么意义。发布实际代码。“最终计数”是可以实现的,但是如果您希望数字按顺序排列,那么就不要使用线程。
count=inc+1没有什么意义。发布实际代码。“最终计数”是可以实现的,但是如果你想让数字按顺序排列,就不要使用线程。不要那么快。这显然是“演示”代码,它取决于以后在实际线程中执行的内容。@Henkholtman我明白你的意思(这是有效的),但我仍然建议使用任务而不是线程。除非OP提供了为什么线程比任务(长时间运行的操作…等等)更好的信息,否则任务将提供更简单的方法来同步它们的执行。不要那么快。这显然是“演示”代码,它取决于以后在实际线程中执行的内容。@Henkholtman我明白你的意思(这是有效的),但我仍然建议使用任务而不是线程。除非OP提供了为什么线程比任务(长时间运行的操作…等等)更好的信息,否则任务将提供更简单的方法来同步它们的执行。不要那么快。这显然是“演示”代码,它取决于以后在实际线程中执行的内容。@Henkholtman我明白你的意思(这是有效的),但我仍然建议使用任务而不是线程。除非OP提供了为什么线程比任务(长时间运行的操作…等等)更好的信息,否则任务将提供更简单的方法来同步它们的执行。不要那么快。这显然是“演示”代码,它取决于以后在实际线程中执行的内容。@Henkholtman我明白你的意思(这是有效的),但我仍然建议使用任务而不是线程。除非OP提供了为什么线程比任务更好的信息(长时间运行的操作等等),否则任务将提供更简单的方法来同步它们的执行。