我有一个正在侦听套接字的线程,并将收到的消息转发给处理引擎。如果发生了一些不幸事件(例如套接字意外关闭),该线程应该如何通知它的“父”它即将结束?
更新:例如,这是一个简单的问题:
class Program
{
private static BlockingCollection<string> queue = new BlockingCollection<string>();
static void Main(string[] args)
{
Thread readingThread = new Thread(new ThreadStart(ReadingProcess));
readingThread.Start();
for (string input = queue.Take(); input != "end"; input = queue.Take())
Console.WriteLine(input);
Console.WriteLine("Stopped Listening to the queue");
}
static void ReadingProcess()
{
string capture;
while ((capture = Console.ReadLine()) != "quit")
queue.Add(capture);
// Stop the processing because the reader has stopped.
}
}
在这个例子中,当Main看到“end”或者读取过程结束时,Main完成了for循环,因为它看到“quit”。两个线程都被阻塞(一个在ReadLine上,另一个在Take。
按照Martin的建议,ReadingProcess可以添加到BlockingQueue并“结束”---但是队列中的这个毒丸可能还有其他东西,在这个阶段我希望队列立即停止。 / p>
答案 0 :(得分:1)
不要让父线程负责。停止线程可以自己进行清理等,并在需要时向中央对象(监听器管理器)报告。
答案 1 :(得分:1)
使用相同的机制将请求转发给处理引擎:有一个特殊的“错误请求”,表明线程已被终止。
或者,使用EventWaitHandle,让父线程等待任何孩子发出意外终止信号。