2015-05-08 32 views
0

在.net中重用线程的正确方法是什么?我知道线程池做到了,但我不知道如何。我已经有很多(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? 

请注意,我不希望在如何做到这一点不使用线程的建议,我确实需要直接使用线程,无论是线程池,也没有任务系统适合我使用案件根本(不愿在这里辩论)。我只是不确定如何干净地回收线程并将其映射到另一个函数以进行新的运行

+2

这是任务的用途。直接使用任务不是线程 – MikeSW

+0

@MikeSW“任务”是异步完成的工作单元的抽象。 'Thread'是一种创建线程异步执行工作的机制。 '任务'确实有一些内置的机制,可以使线程在机制隐藏的情况下工作,但它们并不总是足够的。在某些情况下,您需要创建使用不同底层机制的其他工具。在这种情况下,他可能需要创建一个使用'Thread'创建'Tasks'的抽象。这并不意味着直接使用'Thread'是错误的。 – Servy

+0

@MikeSW如果你直到最后读到这个问题,你才会明白你的评论是毫无意义的。 –

回答

5

您只需编写一个方法来完成一个工作单元,然后完成后再执行另一个工作。就Thread而言,它只是运行它的一个代表,就像它总是这样。委托运行恰好做了两次(或更多,因为它可以继续找工作)逻辑上将程序中的操作分开是它不知道(或关心)的事情。

一个常见的情况,或多或少是线程池所做的,就是让一个“要做的事情”的队列和只有一个循环的线程在循环的主体中从一个循环中抽取一个项目队列并处理它。 (只要确保正确同步线程之间共享的数据即可。)

+0

与任务队列方法一起,您可以将访问者模式应用于您的任务。所以线程只是获取下一个任务并调用它的“DoWork”方法。线程不关心任务是什么,它只是知道它应该执行它。 –

+0

这只会在我的场景是“做方法1,然后2”时才起作用,这是一个示例,在这里我做了一个工作单元,然后线程不再使用,并且当另一个工作单元到达时,我需要能够为它回收一个线程。 –

+0

所以基本上我不得不安排结束代码,但我自己的线程调度程序代码,并执行当前的任务?听起来过于复杂,但我想我应该预料到,我希望我错过了一个thread.delegate - = currentmethod + = newmethod类型的功能,但我想我必须自己做这个 –

相关问题