c# - 在 C# 的任务中使用线程是否毫无意义?
问题描述
我知道线程和任务之间的区别。,但我不明白在任务中创建线程是否与仅创建线程相同。
解决方案
这取决于您如何使用语言的多线程功能和异步编程语义。
先说简单的事实。假设你有一个初始的、简单的、单线程的、近乎空的应用程序(Console.ReadLine
为了简单起见,它只读取一行输入)。如果你创建一个新的Thread
,那么你已经从另一个线程,主线程中创建了它。因此,从线程内创建线程是一个完全有效的操作,也是任何多线程应用程序的起点。
现在, a本身Task
不是线程,但是当您从 .NET 托管线程池中选择时,它会在一个线程中执行。因此,如果您从一个任务中创建一个新线程,那么您实际上是在从一个线程中创建一个线程(与上面相同,不会造成任何伤害)。这里需要注意的是,您无法控制线程或其生命周期,也就是说,您不能杀死它、暂停它、恢复它等,因为您没有该线程的句柄。如果您想要完成某个工作单元,并且您不在乎是哪个线程执行它,那么它不是当前的,那么基本上就是要走的路。话虽如此,您始终可以从任务中启动新线程,实际上,您甚至可以从任务中启动任务Task.Run
Task.Run
,这里是一些关于展开嵌套任务的官方文档。
此外,您可以await
在任务内部,并根据需要在方法内部创建一个新线程async
。async
但是,可用性模式await
是您将它们用于 I/O 绑定操作,这些操作需要很少的 CPU 时间但可能需要很长时间,因为它们需要等待某些东西,例如网络请求和磁盘访问。对于响应式 UI 实现,此技术通常用于防止 UI 被另一个操作阻塞。
至于是否无意义,这是一个用例场景。我遇到了可能是解决方案的情况,但发现重新设计我的程序逻辑以便如果我需要在任务中使用线程,那么我要做的是有两个任务而不是一个任务加上内部线程,给了我一个更干净,更易读的代码结构,但这只是个人风格。
最后一点,这里有一些官方文档的链接和另一篇关于 C# 中多线程编程的文章:
推荐阅读
- c++ - 如何强制覆盖子类中的虚函数
- php - json_decode 除了解码 JSON 有什么特殊用途吗?
- python - 具有 k 步的 Python 反向列表,就地运算符与标准运算符
- python - 每次尝试都给出一个提示(猜数字游戏)
- javascript - 加载时如何聚焦和选择输入?
- javascript - 在鼠标悬停时更改 React 中的背景视频
- html - 悬停时如何更改不是方形的img链接的颜色
- c# - 使用 .net framework 4.7.2 而不是 .net core 实现条带订阅
- java - 将所有带注释的对象添加到集合
- google-cloud-platform - GCP:区域磁盘的写入是否在操作系统 fsync 之前跨区域复制?