.NET - Task.Run vs Task.Factory.StartNew

https://mp.weixin.qq.com/s?src=11&timestamp=1610380767&ver=2822&signature=x*UK4i1ZCby5pK75fi1l0osHgAHgKZzJ4OTJ5LG6PyoKrMdWHSEM1w3-3P2EOuUaGYDa7KldQnt8H6R7tisiSA5NINnglysr26odPUBi4c4-B1ODMxUQRbJAi*1eJh6r&new=1

我们引入了新的 Task.Run 方法。这决不是要淘汰 Task.Factory.StartNew,而是应该简单地认为这是使用 Task.Factory.StartNew 而不必传递一堆参数的一个便捷方式。这是一个捷径。事实上,Task.Run 实际是按照与 Task.Factory.StartNew 相同的逻辑实现的,只是传入了一些默认的参数.

通过这种方式,Task.Run 就可以并且应该被用于大多数通用场景——简单地将工作交给线程池ThreadPool处理(即参数 TaskScheduler.Default 的目标)。这并不意味着 Task.Factory.StartNew 将不再被使用; 远非如此,Task.Factory.StartNew 还有很多重要的(固然更高级)用途。你可以控制 TaskCreationOptions 来控制任务的行为,可以控制 TaskScheduler 来控制任务的调度和运行,也可以使用接收对象状态的重载,对于性能敏感的代码路径,使用该重载可以避免闭包和相应的内存分配。不过,对于简单的情况,Task.Run 是你的朋友。

posted @ 2021-01-12 00:05  悠哉大斌  阅读(69)  评论(0编辑  收藏  举报