Task 和Thread在效率上有什么区别

Task运行带参数的函数

  Task<Int32>   task = Task.Run(() => fun("s", 9));

函数定义:

   private Int32 frun(string s, int m)
        {
        
            return 0;
        }

using System;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    static class Program
    {
        static void Main(string[] args)
        {
            for (var i = 1; i <= 50; i++)
                TestTask(i);
            for (var i = 1; i <= 50; i++)
                TestThreadPool(i);
            for (var i = 1; i <= 50; i++)
                TestThread(i);
            Console.ReadLine();
        }
 
        private static void TestThread(int i)
        {
            Console.WriteLine("Thread {0} start.", i);
            new Thread(h =>
            {
                Thread.Sleep(5000);
                Console.WriteLine("-------------------Thread {0} end.", i);
            }).Start();
        }
 
        private static void TestThreadPool(int i)
        {
            Console.WriteLine("ThreadPool {0} start.", i);
            ThreadPool.QueueUserWorkItem(h =>
              {
                  Thread.Sleep(5000);
                  Console.WriteLine("-------------------ThreadPool {0} end.", i);
              });
        }
 
        private static void TestTask(int i)
        {
            Console.WriteLine("Task {0} start.", i);
            new Task(() =>
            {
                Thread.Sleep(5000);
                Console.WriteLine("-------------------Task {0} end.", i);
            }).Start();
        }
    }
 
 
}
可以看看谁最先打印 ------------------end。 你可以看到,Thread 完胜 Task。

这只是因为Task是用了线程池来控制的,开始的时候线程池内只有默认数量的线程,随着任务增多线程池在增大容量(具体策略不太了解),所以后面几个线程启动晚了。 而Thread是全部一起启动的,所以几乎同时完成。 这是出于稳定性考虑的设计,Task的设计是用来解决实际问题的,比如网络下载、数据读写,瓶颈在于网络或存储的速度,并且要保证稳定。 上面的测试太理论,没有太多实际意义 当然引起思考的作用还是有的...

TASK注重点在并行~ 所以如果你是工作在多核情况下,那么task或许是你最好的选择了,但是thread却无法实现自动化的并行操作~ task是基于threadPool的,所以相比thread来说,就算再单核,我也依然觉得task这种方式会比thread强~

JAVA&NET技术QQ群号:456257217有问题的可以在群里面提问。
原文地址:https://www.cnblogs.com/shiyh/p/14955867.html