.NET 4.5中的任务与线程

5
在.NET 4中,新增了任务(Tasks)功能,我想知道是否可以结合.NET 4.5中的Async/Await,将所有需要异步执行的方法都交给它处理,或者有些情况下我必须使用单独的线程?尤其是我读到Task.Run会使用线程池来实现方法的异步执行。
总之,结合Async/Await和Tasks能否不再使用Threads呢?

这完全取决于你在做什么。 - SLaks
@SLaks,你能否为我澄清一下,什么情况下应该触发一个新的线程来完成我的工作,什么情况下使用线程池(即Task.Run)就足够了? - Roman Ratskey
1个回答

5
如果您指定了 TaskCreationOptions.LongRunning 选项(连续的也有等价物),任务将不使用线程池线程,而是使用常规的 Thread。从技术上讲,这是一个实现细节,不在规范中,但依赖此假设并不是完全不合理的。
鉴于此,您应该能够使用 Task 做任何您可以直接使用 Thread 做的事情。
最初可能想到要直接使用 Thread 的主要情况是创建自己的并行库,假设您选择不在 TPL 上构建它。虽然在业务应用程序的上下文中不重要,但在创建自己的库时,您可能需要访问特定 Thread 对象的底层细节,或者您可能希望避免使用 Tasks 的开销(尽管很小)。
当然,如果您还没有使用 .NET 4.0,则无法使用 Task 选项。

@PeterRitchie:但是只是为了确认我的知识,async await的设计只是为了使方法可等待,所以在当前等待的任务完成之前,程序不会继续执行下一行代码,对吗?还是还有其他用途可以使用Async/Await? - Roman Ratskey
async 使一个方法可以等待其他可等待对象(它们不一定是方法),同时也可以被其他对象等待。在方法上等待可能意味着某些操作是异步的,也可能不是。 - Peter Ritchie
使用async/await的一个好处是,使用await Task.Delay可以更轻松地创建一个“轮询”线程,而无需使用Thread.Sleep占用长时间运行的线程。我发现这消除了我想要创建专用长时间运行线程的绝大多数情况。 - Dan Bryant
@runes 是的,这取决于方法是否执行异步操作。通常意味着等待其他操作完成,或者返回一个任务(Task)... - Peter Ritchie
@DanBryant:没错,最近我发现了这个东西,现在我用它来代替Thread.Sleep。 - Roman Ratskey
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接