gpt4 book ai didi

c# - 如果 abort() 不起作用,强制关闭 'rogue' 线程

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:17 26 4
gpt4 key购买 nike

如标题所示。是的,我知道使用 .abort() 很糟糕,但请听我说完

我正在使用 2 个线程,主线程(我的应用程序)和一个套接字监听线程(熟悉的声音吗?)我没有使用异步 .AcceptAsync() 调用(说实话,主要原因是我没有过多研究它们),而是让线程卡在 socket.Accept(); 上。当然,当我调用 thread.Abort() 时,线程不会关闭,因为它仍在等待连接,一旦它通过 Accept(),它就会中止。

代码:

    void listenserver()
{
while (run)
{
fConsole.WriteLine("Waiting for connections..");
connectedsock = mainsock.Accept();
connected = true;
fConsole.WriteLine("Got connection from: " + connectedsock.RemoteEndPoint);

...和其他地方:

    private void button_start_Click(object sender, EventArgs e)
{
if (!run)
{ //code ommitted.
}
else
{
run = false;
listenthread.Join(3000);
if (listenthread.IsAlive)
{
fConsole.WriteLine("Force-closing rogue listen thread");
listenthread.Abort();
}
button_start.Text = "Start";
groupBox_settings.Enabled = true;
}

有什么方法可以确保线程将结束,而不是将整个内容塞入单独的应用程序然后结束吗?请注意,我确实将 thread.IsBackground 设置为 true(如其他论坛主题中所建议的那样),但这没有任何区别。

最佳答案

既然您已经在使用一个线程,您不妨只使用 BeginAccept。异步代码不需要使您的代码复杂化,因为您可以像这样使用 lambda:

var socket = new Socket(...);

socket.BeginAccept(result =>
{
if (this.abort)
{
// We should probably use a signal, but either way, this is where we abort.
return;
}

socket.EndAccept(result);
// Do your sockety stuff
}, null);

即使 AsyncCallback 有单独的方法定义,代码也不复杂。

通过执行异步 IO,您还可以更有效地利用 CPU 时间,因为在调用 BeginAcceptEndAccept 之间,线程可以重复用于其他处理。由于您在等待连接时并没有将它用于任何有目的的用途,因此占用一个线程是毫无意义且效率低下的。

关于c# - 如果 abort() 不起作用,强制关闭 'rogue' 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787659/

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