【发布时间】:2011-03-09 09:55:05
【问题描述】:
我在以下线程上调用ChannelServer.ListeningThread.Abort,但似乎没有发生任何事情。我想更具体一些,但我想不出更多。似乎没有抛出ThreadAbortException,并且无论阻塞监听器如何都应该抛出这个异常(它在阻塞接收的线程上完美运行)。
重要编辑:使用 ManualResetEvent.WaitOne 而不是 AcceptSocket,正如 Lyrik 建议的测试一样,它可以完美运行。 AcceptSocket怎么会屏蔽ThreadAbortException?
LINK:这个论坛帖子似乎讨论了同样的问题,虽然我想不通:http://www.tek-tips.com/viewthread.cfm?qid=319436&page=413
ChannelServer.ListeningThread = new Thread(new ThreadStart(delegate()
{
Log.Inform("Waiting for clients on thread {0}.", Thread.CurrentThread.ManagedThreadId);
while (true)
{
try
{
new Thread(new ParameterizedThreadStart(ChannelClientHandler.Initialize)).Start(ChannelServer.Listener.AcceptSocket());
}
catch (ThreadAbortException)
{
Log.Inform("Aborted client listening thread {0}.", Thread.CurrentThread.ManagedThreadId);
break;
}
}
}));
ChannelServer.ListeningThread.Start();
【问题讨论】:
-
我无法想象这是做任何你想做的事情的正确方法。你真的不应该产生这么多线程。
-
@Adam,这是服务器上的一段普通代码...为每个接受的连接启动一个新线程。
-
哎呀,这在任何东西上都是不正常的,除了一个微不足道的服务器。每个连接的线程通常会在扩展时引起问题。
-
这是一个微不足道的服务器,这不是问题的重点。 :)
-
顺便说一句,因为这里的行为似乎是调用阻塞了内核(并且托管线程上的 Abort 不足以让它解除阻塞),根据 MSDN 页面,您可能想要在 Pending 上循环:“如果您想避免阻塞,请使用 Pending 方法来确定传入连接队列中是否有可用的连接请求。”
标签: c# .net multithreading thread-abort threadabortexception