在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法。它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至控制任务的调度行为。所有这些能力也带来了复杂性的提升,你必须知道何时应该使用何种 ...
在.Net 4中,Task.Factory.StartNew
是启动一个新Task
的首选方法。它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至控制任务的调度行为。所有这些能力也带来了复杂性的提升,你必须知道何时应该使用何种重载方法,提供哪种调度方式等等。并且Task.Factory.StartNew
这种写法也不够简洁明快,至少对它使用的主要场景不够快,一般它使用的主要场景只是将一个工作任务丢给一个后台get='_blank'>线程执行而已。
于是,在.NET Framework 4.5开发者预览版中,微软引进了新的Task.Run
方法。新方法不是为了替代旧的Task.Factory.StartNew
方法,只是提供了一种使用Task.Factory.StartNew
方法的更简洁的形式,而不需要去指定那一系列参数。这是一个捷径,事实上,Task.Run
的内部实现逻辑跟Task.Factory.StartNew
一样,只是传递了一些默认参数。比如当你使用Task.Run
:
Task.Run(someAction);
实际上等价于:
Task.Factory.StartNew(someAction, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
使用这些默认参数,Task.Run
就能用于大多数情况——只是将任务简单的交给后台线程池去执行(这也是使用TaskScheduler.Default
参数的目标)。这也并不意味着Task.Factory.StartNew
方法就不必再使用了,它仍然有很多重要的用处。你可以通过控制TaskCreationOptions
参数来控制任务的行为,你也可以通过控制TaskScheduler
来控制任务应该如何排队如何运行,你也可以使用重载方法中的接受对象状态那个参数,对于一些性能敏感的代码,它可以用于避免闭包以及相应的资源分配。不过对于上面那个简单的例子,Task.Run
是最友好。
Task.Run
提供了八种重载方式,用于提供下面这几种组合情况:
- 普通任务(
Task
)和带返回值任务(Task<TResult>
) - 可取消任务(
Cancelable
)和不可取消任务(non-cancelabl
) - 同步委托(
Synchronous
)和异步委托(Asynchronous
)
前两个很明显,对于第一点如果是用的Task
做返回值的重载方法,那么该任务就没有返回值,如果是用的Task<TResult>
做返回值的重载方法,那么该任务就有一个类型为TResult
的返回值。对于第二点,也有接受CancellationToken
参数的重载,可以在任务开始之前执行取消操作,然后并行任务(Task Parallel Library——TPL)就可以自然的过度到取消状态。
原标题:Task.Run 和 Task.Factory.StartNew
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。