C# 为不同的操作重用线程

C# 为不同的操作重用线程,c#,.net,multithreading,C#,.net,Multithreading,在.net中重用线程的正确方法是什么?我知道threadpool会这么做,但我不知道怎么做。我已经有很多(100+个)线程的服务器代码工作得很好,但目前我有一个新的场景,我需要重用线程,而不是用于相同的操作,而是用于不同的操作 如果我有2个方法,如何重用映射到方法1的线程,并将其映射到运行方法2 伪代码: var thread = new Thread(method1); do work with thread here done, now how do i reuse the threa

在.net中重用线程的正确方法是什么?我知道threadpool会这么做,但我不知道怎么做。我已经有很多(100+个)线程的服务器代码工作得很好,但目前我有一个新的场景,我需要重用线程,而不是用于相同的操作,而是用于不同的操作

如果我有2个方法,如何重用映射到方法1的线程,并将其映射到运行方法2

伪代码:

 var thread = new Thread(method1);
 do work with thread here
 done, now how do i reuse the thread but tell it which method to run without creating a new one?

请注意,我不是在寻找关于如何在不使用线程的情况下实现这一点的建议,我确实需要直接使用线程,无论是线程池还是任务系统都不适合我的用例(不愿意在这里讨论)。我只是不确定如何干净地回收一个线程并将其映射到另一个函数以进行新的运行

您只需编写一个方法,该方法执行一个工作单元,然后在完成后继续执行另一个工作单元。至于
线程
,它只是在一个委托中运行,就像往常一样。委托运行恰好在程序中执行两个(或更多,因为它可以不断找到要执行的工作)逻辑上独立的操作,这是它不知道(或关心)的事情


一种常见的情况是,线程池或多或少都会这样做,即有一个“要做的事情”队列,而线程只有一个循环,在循环体中,该循环从队列中提取一个项目并对其进行处理。(只需确保正确同步线程之间共享的数据即可。)

您只需编写一个执行一个工作单元的方法,然后在完成后继续执行另一个工作单元。至于
线程
,它只是在一个委托中运行,就像往常一样。委托运行恰好在程序中执行两个(或更多,因为它可以不断找到要执行的工作)逻辑上独立的操作,这是它不知道(或关心)的事情


一种常见的情况是,线程池或多或少都会这样做,即有一个“要做的事情”队列,而线程只有一个循环,在循环体中,该循环从队列中提取一个项目并对其进行处理。(请确保在此正确同步线程之间共享的数据。)

这就是任务的目的。使用任务而不是线程directly@MikeSW任务是异步完成的工作单元的抽象<代码>线程是一种创建线程以异步工作的机制<代码>任务确实有一些内置机制,用于在机制对您隐藏的情况下使用线程执行工作,但它们并不总是足够的。在某些情况下,您需要创建以不同方式使用底层机制的其他工具。在这种情况下,他可能需要创建一个抽象,使用
线程
来创建
任务
。这并不意味着直接使用
Thread
是错误的。@MikeSW如果你把问题读到最后,你就会明白你的评论是毫无意义的。这就是任务的目的。使用任务而不是线程directly@MikeSW任务是异步完成的工作单元的抽象<代码>线程是一种创建线程以异步工作的机制<代码>任务确实有一些内置机制,用于在机制对您隐藏的情况下使用线程执行工作,但它们并不总是足够的。在某些情况下,您需要创建以不同方式使用底层机制的其他工具。在这种情况下,他可能需要创建一个抽象,使用
线程
来创建
任务
。这并不意味着直接使用
Thread
是错误的。@MikeSW如果你把问题读到最后,你就会明白你的评论是毫无意义的。除了任务队列方法,你可以将访问者模式应用到你的任务中。因此,线程只是获取下一个任务并调用其“DoWork”方法。线程不关心任务是什么,它只知道它应该执行它。只有当我的场景是“执行方法1,然后执行2”时,这才有效。这是一个示例,我在这里执行一个工作单元,然后线程不再使用,当另一个工作单元出现时,我需要能够为它回收一个线程。因此,基本上我必须在线程上调度我自己的调度程序代码,而不是结束代码,并让它执行当前任务?听起来太复杂了,但我想我应该预料到,我希望我错过了一个线程。委托-=currentmethod+=newmethod这类功能,但我想我必须这样做myself@RonanThibaudau正如我所说的,这些都不是为你而建的,但肯定是你可以为自己而建的。正如我所提到的,一个同步的委托队列是一个基本版本,可以完成大部分工作,但它是一个非常简单的解决方案。@JamesR。您根本不需要访问者模式,只需要委托(或者,如果您愿意,只需要一个带有一个方法的接口)。不需要对传递的参数进行虚拟分派,因为不需要传递参数。与任务队列方法一起,您可以将访问者模式应用于任务。因此,线程只是获取下一个任务并调用其“DoWork”方法。线程不关心任务是什么,它只知道它应该执行它。只有当我的场景是“执行方法1,然后执行2”时,这才有效。这是一个示例,我在这里执行一个工作单元,然后线程不再使用,当另一个工作单元出现时,我需要能够为它回收一个线程。因此,基本上我必须在线程上调度我自己的调度程序代码,而不是结束代码,并让它执行当前任务?听起来太复杂了,但我想我应该预料到,我希望我错过了一个线程。委托-=currentmethod+=newmethod这类功能,但我想我必须这样做myself@RonanThibaudau正如我所说的,这些都不是为你而建的,但肯定是你可以为自己而建的。正如我提到的,一个同步的代理队列