C#中的异步任务执行

本文关键字:任务 执行 异步 | 更新日期: 2023-09-27 18:21:14

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

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

C#中的异步任务执行

如果异步任务是在调用它们的同一个线程上执行的,那么如果我创建了1000个任务,并且它们都将在同一线程上通过时间切片执行呢?

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

一些涉及async方法的场景中,给定线程可能为两个或多个任务提供服务。这是线程池的本质所固有的,线程池在整个TPL API中广泛使用。但是,如果这些方法本身正在等待其他异步操作,那么在"并发"这个词的任何意义上,这些方法都会得到服务的唯一原因就是。在这些情况下,他们可以协同生成线程,此时其他任务可能会利用它

如果不是这样,并且任务在不同的线程上执行,那么它与多线程(并行执行)有何不同?

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

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

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


我已尽我所能,尽可能直接简洁地回答你的问题。然而,如果以上内容提出的新问题和回答的旧问题一样多,我也不会感到惊讶。不幸的是,这就是潜在的广泛问题的本质。我确实希望以上内容满足了你的好奇心,但如果没有,那就意味着你最初的问题对Stack Overflow来说太宽泛了。请考虑改写你的问题,使其更具体地集中在一个问题上;包括一个良好的最小完整的上下文代码示例,以便以特定的方式解决问题,而不会产生歧义。