相关疑难解决方法(0)

为什么Parallel.ForEach比AsParallel()快得多.ForAll()即使MSDN建议不然?

我一直在做一些调查,看看我们如何创建一个贯穿树的多线程应用程序.

为了找到如何以最佳方式实现这一点,我创建了一个运行在我的C:\ disk中的测试应用程序并打开所有目录.

class Program
{
    static void Main(string[] args)
    {
        //var startDirectory = @"C:\The folder\RecursiveFolder";
        var startDirectory = @"C:\";

        var w = Stopwatch.StartNew();

        ThisIsARecursiveFunction(startDirectory);

        Console.WriteLine("Elapsed seconds: " + w.Elapsed.TotalSeconds);

        Console.ReadKey();
    }

    public static void ThisIsARecursiveFunction(String currentDirectory)
    {
        var lastBit = Path.GetFileName(currentDirectory);
        var depth = currentDirectory.Count(t => t == '\\');
        //Console.WriteLine(depth + ": " + currentDirectory);

        try
        {
            var children = Directory.GetDirectories(currentDirectory);

            //Edit this mode to switch what way of parallelization it should use
            int mode = 3;

            switch (mode) …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing performance foreach multithreading

32
推荐指数
2
解决办法
1万
查看次数

.NET线程是否与操作系统线程不同?

  1. .NET线程是轻量级用户模式线程还是内核模式操作系统线程?

  2. 另外,保留SQL Server,.NET线程和操作系统线程之间是否存在一对一的对应关系?

我也很感兴趣,因为Thread具有对称对命名方法的类BeginThreadAffinityEndThreadAffinity,其文档巧妙地表明,.NET线程是在真正的操作系统线程轻量级的抽象.

此外,我刚才读到一些堆栈溢出线程本身,微软试图在CLR中维护这种分离,就像SQL Server一样.我记得有一些项目正在使用Fiber API来实现这个目的,但我不能说我理解了所读的所有细节.

我想要一些关于这个主题的更详细的文献,比如.NET线程的内部结构与Windows创建的线程的内部结构相比.虽然有很多关于Windows创建的线程结构的信息,但Jeffrey Richter的高级Windows编程书是其中一个来源,例如,我找不到任何专门用于.NET线程内部结构的文献.

有人可能会争辩说,这些信息可以在.NET源代码中找到,现在可以公开使用,或者使用反汇编程序,如Reflector或IL Spy,但我没有看到任何代表线程控制块(TCB)和程序的信息.计数器(PC)和堆栈指针(SP)或线程的等待队列,或者线程当前是Thread该类中成员的队列列表.

我在哪里可以读到这个?文档中是否提到了它的任何内容?我已经从MSDN上阅读了所有这些页面,但它们似乎没有提到它.

.net c# clr multithreading

14
推荐指数
1
解决办法
1370
查看次数