如果我从UI点击按钮开始计算密集型TPL任务,那么哪种方法最好: TaskFactory.StartNew 或 TaskFactory.FromAsync ?我需要以下内容:任务不能挂起UI,快速完成工作,此外,在应用程序中可以执行其他一些TPL任务。这里的时间是对应用程序中运行的所有任务的工作速度的关键要求。在哪种情况下,开销会减少,任务执行速度会增加?
答案 0 :(得分:3)
这两种方法是为完全不同的目的而设计的。
TaskFactory.StartNew
(或.NET 4.5中的Task.Run
)允许您使用委托启动某些工作。
TaskFactory.FromAsync
有不同的用途。它的目的是使用Asynchronous Programming Model (APM)来定义一个异步方法的方法对,并将其转换为Task<T>
。这将采用现有的异步方法并将其转换为新的Task<T>
类型,从而允许与其他任务合成。
通常,与正在完成的工作相比,运行Task的开销应该很小,特别是如果工作“计算成本高”的话。如果您正在处理一组任务,我会使用Task.Run
或Task.Factory.StartNew
来启动单个任务,使用Parallel
类方法(或PLINQ)。
如果您正在尝试处理许多工作项(更多工作项,然后处理系统上的元素/ CPU内核),这些类将提供更好的性能,因为它们将预先处理工作分区以减少开销并行化。