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

C#任务不像我期望的那样,c#,multithreading,task,difference,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

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

    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();
        }
    }
public void ThreadProc()
{
控制台。写入(“s”);
睡眠(1000);
控制台。写入(“e”);
}
公共void TestByThread()
{
对于(变量i=0;i<10;i++)
{
线程t=新线程(新线程开始(线程进程));
t、 Start();
}
}
运行TestByThread()时,结果如下:

SSSSSSSSEEEEEEE

但当谈到任务时

    public void TestByTask()
    {

        for (var i = 0; i < 10; i++)
        {
            Task.Run(() =>
            {
                Console.Write("s");
                Thread.Sleep(1000);
                Console.Write("e");
            });
        }
    }
public void TestByTask()
{
对于(变量i=0;i<10;i++)
{
Task.Run(()=>
{
控制台。写入(“s”);
睡眠(1000);
控制台。写入(“e”);
});
}
}
执行TestByTask()时,结果很奇怪:

SSSSSSSESEEEEEE

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


任务和线程之间有什么区别?

Thread.Start()
启动一个新线程,其中
Task.Run()
调度任务。然后,该任务由下一个可用的工作线程执行。可能会创建一个新线程,但不要依赖于此。

在第一个示例中,您手动创建10个线程并并行运行它们。由于每个线程在写入
“e”
之前等待1秒,因此由于并行性,所有10个
“s”
都已写入


当您使用
Task.Run
时,您指示CLR在池中有一个可用工作线程时立即启动一个新任务。通常,池中的工作线程数与CPU核心数相同(但这不是保证),因此基本上,即使调用
Task.Run
10次,也不意味着10个线程将立即开始工作。恰恰相反,它将只启动池中当前可用的任务,然后其他线程将等待第一个任务完成后再重新启动。

当您调用
线程时。start
创建一个新线程,所有线程打印
s
,然后等待,所有线程打印
e

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


当池中的某些任务完成时(即打印的
e
),这些任务可用于运行新任务,因此它会在挂起状态下启动其余任务。

问题非常广泛-任务和线程是非常不同的概念。您是否阅读了关于这两个方面的文档和指南?是否有一些您不了解的具体方面?因为这个问题似乎暗示您希望它们的行为相同,所以我建议您首先阅读文档,然后缩小您的问题范围。这个问题并不宽泛,因为它有两个示例代码和两个示例结果,op希望了解执行中的差异。拥有深入的知识和阅读文档无论如何都能解决这个问题,那么,为什么还要来填充呢?人们来到这里分享别人可能拥有的知识。只要简单地告诉op阅读文档,就等于告诉他什么都不要使用SO。这个问题很有道理,而且很狭隘。