gpt4 book ai didi

c# - Thread.Abort 似乎没有抛出 ThreadAbortException 因为 AcceptSocket

转载 作者:行者123 更新时间:2023-11-30 18:44:14 25 4
gpt4 key购买 nike

我正在以下线程上调用 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();

最佳答案

我不确定您为什么会收到该错误,但这是一个有效的简单示例:

ManualResetEvent mrse = new ManualResetEvent(false);
Thread test = new Thread(() =>
{
while (true)
{
try
{
mrse.WaitOne();
}
catch (ThreadAbortException)
{
Console.WriteLine("No problem here...");
}
}
});

test.IsBackground = true;
test.Start();

Thread.Sleep(1000);
test.Abort();
Console.ReadKey();

所以它对我有用...我假设您已经通过调试器并且没有命中 catch 语句中的断点,对吗?

注意:调用Abort 是不好的做法,您应该调用Interrupt 并处理ThreadInterruptedException...这样更安全。

关于c# - Thread.Abort 似乎没有抛出 ThreadAbortException 因为 AcceptSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3137274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com