LINQ可枚举线程

1 c# linq foreach multithreading enumerable.range

我试图理解LINQ如何处理线程.以下代码生成ThreadStateException"Thread尚未启动".为什么会这样?

        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);
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 9

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

所以你有.Start一组线程,.Join另一组.您需要急切地评估查询一次,然后缓存结果.

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

您也可以将其编写为单个语句:

var threads = Enumerable.Range(1,50).Select(...).ToArray();
Run Code Online (Sandbox Code Playgroud)