2011-09-17 39 views
0

我是非常新的多线程和c#,我必须解决这个问题: 我有事件处理程序,它很频繁地触发(它必须这样做,因为事件处理程序调用是从DLL调用) 当处理程序方法被调用时,我需要创建并运行一个线程,它会做一些东西,它的处理可以从几毫秒到几秒不等,当它完成它的工作时,它会自己杀死它。完成后,evenhandler可以创建另一个线程。同时创建的线程正在运行,没有其他线程可以创建并从事件处理程序运行。从事件处理程序运行自杀线程

非常感谢您的帮助。

+0

当先前创建的工作线程仍在运行时引发事件时,您想要执行什么操作?阻塞引发事件的线程,直到工作线程完成?排队新线程的产卵并返回?只是决定不产生新的线程并返回? – Ani

+0

如何检查事件处理程序线程是否已在运行,并使线程安全?这似乎很容易,只是为了跳过创建新的线程。 – BreteP

回答

4

所有这些听起来很复杂,我没有什么你实际上是试图做一个良好的意识,但它听起来像这样将与额外的线程和共享队列可以更好地处理工作项目。您的事件处理程序只会将另一个工作项添加到队列中,并且该线程将从队列中选择项并逐个处理它们。

.NET 4通过BlockingCollection<T>类型使这变得容易。在.NET 4之前,它仍然是可行的,但是您需要找到第三方线程安全的生产者/消费者队列或自己编写一个队列。

+0

我已经关闭了dll,它正在读取http流,并且不时发现它触发事件处理程序的一些数据。我需要创建线程并将这些数据传递给线程进行处理。同时dll线程仍在运行,并从http读取数据并触发事件处理程序,但我不想创建用于数据处理的新线程,直到第一个线程完成。 – BreteP

0

自杀的线程存在问题。当线程自行杀死时,必须与主线程同步。

这听起来好像你会做一个单一的专用线程来完成这项工作。使用阻塞队列并实施生产者/消费者模式。当它没有任何事情时,不要杀死线程,而是让它处于空闲状态,直到更多工作到达。

+0

那也应该工作,就像我写的,我对线程很陌生。我会很感激一些简短的例子,特别是如何检测线程是否正在处理(跳过将数据发送到事件处理程序中的线程)。 – BreteP