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强~