c# - LINQ 可枚举线程

标签 c# multithreading linq foreach enumerable.range

我正在尝试了解 LINQ 如何处理线程。以下代码生成 ThreadStateException“线程尚未启动”。为什么会这样?

        var threads = Enumerable.Range(0, 50).Select(x =>
                                                         {
                                                             Thread thread = new Thread(Method);
                                                             thread.Name = x.ToString();
                                                             return thread;
                                                         });


        foreach (var thread in threads)
        {
            thread.Start();
        }

        foreach (var thread in threads)
        {
            thread.Join();
        }

        Console.WriteLine(j);

最佳答案

您的问题与线程无关。当第二次枚举 threads 时,您的查询将被第二次执行并创建第二组线程。

因此您.Start 一组线程,.Join 另一组。您需要急切地对查询求值一次,然后缓存结果。

IEnumerable<Thread> lazyThreads = Enumerable.Range(...
Thread[] threads=lazyThreads.ToArray();//Evaluate and store in an array

你也可以把它写成一条语句:

var threads = Enumerable.Range(1,50).Select(...).ToArray();

关于c# - LINQ 可枚举线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5433244/

相关文章:

linq - 使用 LINQ 选择具有不同列值的所有行

c# - 在 C# 中设置电子邮件附件名称

c# - 慢 SoapHttpClientProtocol 构造函数

c# - 为什么我需要在 Razor 中使用相同的两次?

c# - 线程挂起,直到我附加调试器

java - 是否有必要对仅在删除操作时访问的列表进行同步

c++ - cpp中如何防止多个线程同时使用单例类实例

c# - ASP.NET MVC 中的动态 LINQ 分组查询

javascript - 3个文本框,1个按钮,单击按钮将文本放入光标所在的文本框中

c# - 在 C# 中显示分层数据