C# 任务不像我期望的那样

标签 c# multithreading task difference

<分区>

首先,我用线程实现了测试逻辑:

    public void ThreadProc()
    {
        Console.Write("s");
        Thread.Sleep(1000);
        Console.Write("e");
    }

    public void TestByThread()
    {
        for (var i = 0; i < 10; i++)
        {
            Thread t = new Thread(new ThreadStart(ThreadProc));
            t.Start();
        }
    }

当运行 TestByThread() 时,结果是这样的:

sssssssseeeeeeeeee

但是当涉及到任务时...

    public void TestByTask()
    {

        for (var i = 0; i < 10; i++)
        {
            Task.Run(() =>
            {
                Console.Write("s");
                Thread.Sleep(1000);
                Console.Write("e");
            });
        }
    }

执行TestByTask()时,结果很奇怪:

ssssssseesesseeeeeeee

不仅字符顺序不同,输出速度也不同。

任务和线程有什么区别?

最佳答案

当你调用Thread.Start时,一个新线程被创建,所有线程打印s然后等待,所有线程都打印e .

对于Task.Run,任务在线程池中只有很少的线程。这似乎有点奇怪,因为池中只有 7 个线程可用,可能是一些线程正忙于做某事。所以 7 次任务打印 s,它们都进入休眠状态,但是队列中还有更多任务根本没有开始。

当池中的一些任务完成(打印 e)时,这些任务可用于运行新任务,因此它会启动其余待处理任务。

关于C# 任务不像我期望的那样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391470/

相关文章:

c# - 将 xstream 生成的 xml 读入 .net

c# - Automapper 中缺少类型映射配置或不支持的映射错误

c++ - 如何开始使用多线程编程?

Node.js 后台任务

c# - 为初始加载编译后的 ASP.Net MVC 切换文化

c# - 使用 Linq to SQL 将 FieldExpression 转换为 LambdaExpression 时出错

grails - 从quartz作业访问grails应用程序配置

java - 在 shell 脚本中调用连续的 java 任务

c - pthreads: 在 Redhat 6.8 下不能生成超过 70 个

java - 如何防止多个对话框同时出现?