c# - C#中的异步任务执行

标签 c# .net asynchronous async-await task-parallel-library

我是 C# 中的 TAP 和 TPL 的新手,在谷歌搜索和阅读一些 Material 后,我无法理解异步任务是如何执行的。(特别是在哪个线程上) 请帮助我了解以下两个选项中哪一个是正确的:

如果异步任务在调用它们的同一个线程上执行,那么如果我创建 1000 个任务并且它们都将在同一个线程上按时间切片执行怎么办?如果不是这样并且任务在不同的线程上执行,那么它与多线程(并行执行)有何不同?

最佳答案

If async tasks are executed on the same thread on which they are invoked, then what if I create 1000 tasks and they all will be executed by time slicing on same thread?

由于异步任务不在调用它们的同一线程上执行,因此考虑它们是否都将以某种特定方式执行是没有意义的。在任何情况下,.NET 中都没有在单个线程内“时间片”的机制。时间片是在线程的粒度上完成的;即 CPU 时间被授予线程,而不是线程的子集。

一些场景中涉及async方法,一个给定的线程可能服务于两个或多个任务。这是线程池的本质所固有的,线程池在整个 TPL API 中被广泛使用。但是,从“并发”这个词的任何意义上来说,这些方法将得到服务的唯一原因是,如果它们本身正在等待其他异步操作。在这些情况下,它们可以合作让出线程,此时其他一些任务可能会使用它。

if it is not so and tasks execute on different threads then how is it different from multi-threading (parallel execution)?

asyncTask是“并行执行”的超集。也就是说,一些任务是并行执行的。但是asyncTask也用于根本不涉及执行的操作,而只是等待 CPU 外部发生一些异步事件(例如网络或文件 I/O)。

计算任务将被分配一个单独的线程,供该任务在任务期间使用。其他类型的异步操作根本不会使用线程。

对于计算任务,这些在基本层面上与多线程没有什么不同。就像编程中的许多事情一样,更多的是 asyncTask提供有用的抽象,使人们可以更轻松地编写代码以利用计算机中的多线程功能,同时还表示在语义上类似于并发计算操作的非计算操作。


我已尽力尽可能直接和简洁地回答您的问题。但是,如果以上内容提出的新问题与旧问题的回答一样多,我也不会感到惊讶。不幸的是,这就是潜在广泛问题的性质。我确实希望以上内容能满足您的好奇心,但如果没有,那将意味着您的原始问题对于 Stack Overflow 而言过于宽泛。请考虑重写您的问题,以便更具体地关注一个问题;包括 a good, minimal, complete code example上下文,以便可以以特定的方式解决问题,而不会产生歧义。

关于c# - C#中的异步任务执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33623246/

相关文章:

c# - WPF设计问题

javascript - 如何在 Node.js 测试中关闭 net.Server?

c# - 异步lambda是否应在异步功能中运行?

f# - 使用异步工作流进行并行化的最佳实践

c# - 解析几乎格式正确的 XML 片段 : how to skip over multiple XML headers

c# - 如何编写 Web Api 单元测试,我应该从 UserManager 获取信息

c# - 如何使用这个 "combined"数据类型 : (int, int)[]

.net - .NET Framework 4.0中的类型差异

c# - ASP.NET 使用 MVC 将 linq 查询结果绑定(bind)到 HTML.DropDownList()

c# - 无法删除.NET API发布中的文件