Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制关闭';流氓';如果abort()不';行不通_C#_Multithreading_Sockets_Abort_Forceclose - Fatal编程技术网

C# 强制关闭';流氓';如果abort()不';行不通

C# 强制关闭';流氓';如果abort()不';行不通,c#,multithreading,sockets,abort,forceclose,C#,Multithreading,Sockets,Abort,Forceclose,正如标题所示。 是的,我知道使用它很糟糕。abort()但是请听我说完 我使用2个线程,主线程(我的应用程序)和套接字侦听线程(有人熟悉吗?) 我没有使用asynchronous.AcceptsSync()调用(tbh,主要原因是我没有过多地研究它们),而是让线程挂在socket.Accept()上; 当然,当我调用thread.Abort()时,线程不会关闭,因为它仍在等待连接,一旦通过Accept(),它就会很好地中止 代码: void listenserver() {

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

我使用2个线程,主线程(我的应用程序)和套接字侦听线程(有人熟悉吗?) 我没有使用asynchronous.AcceptsSync()调用(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(如其他论坛线程中所建议的),但这没有任何区别。

既然您已经在使用线程,那么您最好只使用
beginacept
。异步代码不需要使代码复杂化,因为您可以像这样使用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);
即使对
异步回调
使用单独的方法定义,代码也并不复杂


通过执行异步IO,您的CPU时间效率也会大大提高,因为在调用
beginacept
endacept
之间,线程可以重新用于其他处理。由于您在等待连接时没有将其用于任何目的,因此挂起线程毫无意义且效率低下。

如果您知道
beginacept
endacept
将解决您的问题,为什么你继续要求一个不涉及这些方法的解决方案?因为我只想同时打开一个连接。我知道使用async将极大地扩展我的代码,所以我想我应该尽可能地保持它的简单性,并这样做。我猜这是不可能的,那么我就使用AcceptSync。似乎是合理的,但是你必须保持线程循环,否则程序就会退出(因为在这种情况下它是一个控制台项目)。或者beginacept()是否也会阻止线程?不可中断,也就是说…--无论如何,我将把这标记为一个好的答案,而且我已经找到了一种杀死套接字的方法,如果你在另一个线程中关闭套接字,它将抛出一个中断的异常,如果你处理了这个问题,你可以优雅地关闭线程。你必须让GUI线程保持活动状态,是的
beginacept
将立即返回。