如果abort()不起作用,FORCE关闭'流氓'线程

时间:2011-10-16 22:03:05

标签: c# multithreading sockets abort forceclose

正如标题所暗示的那样。 是的,我知道使用.abort()是可怕的,但是听我说出来

我正在使用2个线程,主线程(我的应用程序)和套接字监听线程(熟悉的声音有人吗?) 而不是使用异步.AcceptAsync()调用(tbh,主要原因是我没有看太多),我有线程只挂在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(正如其他论坛帖子中所建议的那样),但它没有任何区别。

1 个答案:

答案 0 :(得分:1)

由于您已经在使用线程,因此您也可以使用BeginAccept。异步代码不需要使代码复杂化,因为您可以使用这样的lambdas:

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之间,线程可以重复用于其他处理。因为你在等待连接时没有使用它来进行任何有目的的操作,所以保持一个线程是没有意义和低效的。