【问题标题】:Async tasks execution in C#C# 中的异步任务执行
【发布时间】:2015-11-10 15:58:03
【问题描述】:

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

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

【问题讨论】:

  • 我认为 async await 比并行库慢,它是为了让你的 UI 非阻塞而不是大量并行操作。创建Tasks 也有一些开销,所以我认为创建大量它们不是一个好主意。此外,任务不会创建新线程,而是使用线程池。 (还有一件事我之前弄错了 - async 本身并没有做任何自动的 Task/Thread 创建)
  • @kirotab 确实我将异步与任务创建混淆了;)

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


【解决方案1】:

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

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

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

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

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

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

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


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

【讨论】:

  • 非常感谢你这么详细的解释,因为我刚开始学习任务和并行编程,你肯定已经扫清了我最初的障碍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多