首页 > 解决方案 > 在 C# 的任务中使用线程是否毫无意义?

问题描述

我知道线程和任务之间的区别。,但我不明白在任务中创建线程是否与仅创建线程相同。

标签: c#multithreadingasynchronoustask

解决方案


这取决于您如何使用语言的多线程功能和异步编程语义。

先说简单的事实。假设你有一个初始的、简单的、单线程的、近乎空的应用程序(Console.ReadLine为了简单起见,它只读取一行输入)。如果你创建一个新的Thread,那么你已经从另一个线程线程中创建了它。因此,从线程内创建线程是一个完全有效的操作,也是任何多线程应用程序的起点。

现在, a本身Task不是线程,但是当您从 .NET 托管线程池中选择时,它会在一个线程中执行。因此,如果您从一个任务中创建一个新线程,那么您实际上是在从一个线程中创建一个线程(与上面相同,不会造成任何伤害)。这里需要注意的是,您无法控制线程或其生命周期,也就是说,您不能杀死它、暂停它、恢复它等,因为您没有该线程的句柄。如果您想要完成某个工作单元,并且您不在乎是哪个线程执行它,那么它不是当前的,那么基本上就是要走的路。话虽如此,您始终可以从任务中启动新线程,实际上,您甚至可以从任务中启动任务Task.RunTask.Run,这里是一些关于展开嵌套任务的官方文档。

此外,您可以await在任务内部,并根据需要在方法内部创建一个新线程asyncasync但是,可用性模式await是您将它们用于 I/O 绑定操作,这些操作需要很少的 CPU 时间但可能需要很长时间,因为它们需要等待某些东西,例如网络请求和磁盘访问。对于响应式 UI 实现,此技术通常用于防止 UI 被另一个操作阻塞。

至于是否无意义,这是一个用例场景。我遇到了可能是解决方案的情况,但发现重新设计我的程序逻辑以便如果我需要在任务中使用线程,那么我要做的是有两个任务而不是一个任务加上内部线程,给了我一个更干净,更易读的代码结构,但这只是个人风格。

最后一点,这里有一些官方文档的链接和另一篇关于 C# 中多线程编程的文章:


推荐阅读