除非您实际上正在等待TCP/IP端口上发生的事情,否则您不应该(ab)使用Listen
。
一种有效的方法是AutoResetEvent
,当您想要触发任务处理时发出信号。这将使你的线程睡眠,直到它需要做某事,没有任何投票。
class TaskProcessor
{
AutoResetEvent newTaskHandle = new AutoResetEvent(false);
Queue<Task> taskQueue = new Queue<Task>();
object syncRoot = new object();
public void ProcessTasks()
{
while (true)
{
newTaskHandle.WaitOne();
Task task = null;
lock (syncRoot)
{
if (taskQueue.Count > 0)
{
task = taskQueue.Dequeue();
}
}
// Do task
}
}
public void AddTask(Task task)
{
lock (syncRoot)
{
taskQueue.Enqueue(task);
newTaskHandle.Set();
}
}
}
这可能会引发如何中止处理任务的问题。您可以使用多单WaitHandler
(从继承的AutoResetEvent),并等待任何人的出现:
WaitHandle[] handles = new WaitHandle[] { newTaskHandle, stopHandle };
int signalledHandle = WaitHandle.WaitAny(handles);
或者,你可以介绍一个简单的布尔和重复使用相同的事件。如果你想确保在停止之前处理所有的任务,那实际上可能是可取的。
关于'也'部分:请作出一个单独的问题。 – 2010-01-08 14:24:01
你到底在等什么?如果您正在等待TCP连接,那么最好听,否则其中一个等待对象,例如AutoResetEvent,会更好。对于WaitHandles,请参阅http://www.yoda.arachsys.com/csharp/threads/waithandles.shtml – Ryan 2010-01-08 14:29:11