C#中的异步任务执行

时间:2015-11-10 05:05:42

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

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

涉及async方法的某些方案中,给定线程可能会为两个或更多任务提供服务。这是线程池的本质所固有的,它在整个TPL API中广泛使用。但是,这种方法在任何“并发”一词的意义上得到服务的唯一原因就是它们本身是在等待其他异步操作。在这些情况下,他们可以合作地产生线程,此时其他任务可能会使用它。

  

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

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

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

对于计算任务,这些与基本级别的多线程没有什么不同。与编程中的许多内容一样,asyncTask提供了更多有用的抽象,允许用户更轻松地编写代码以利用计算机中的多线程功能,同时也代表非计算操作,否则在语义上类似于并发计算操作。


我已尽最大努力尽可能直接,简明地回答您的问题。然而,如果上面提出了许多新的问题,我会不会感到惊讶。不幸的是,这是潜在广泛问题的本质。我希望上面的内容能满足你的好奇心,但如果没有,那就意味着你的原始问题对Stack Overflow而言过于宽泛。请考虑重写您的问题,以便更专注于某个问题;包含a good, minimal, complete code example用于上下文,以便可以以特定方式解决问题而不会产生歧义。