线程测试Tcp连接错误发生

时间:2011-01-03 06:20:29

标签: c# sockets testing tcpclient

我尝试测试套接字连接。它显示错误

  

无法访问已处置的对象。   对象名:'System.Net.Sockets.TcpClient'。

在Connect(ip,port)。

       System.Net.Sockets.TcpClient client = new TcpClient();
        try
        {
            System.Threading.Thread t = new System.Threading.Thread(() =>
        {
            client.Connect(ip,port );

        });
            t.Start();
        }
        catch (SocketException ex)
        {


        }
        catch (Exception ex) {

        }
        finally
        {
            client.Close();
        }

2 个答案:

答案 0 :(得分:3)

这是你从这里开始的主题之间的竞争条件:

    System.Threading.Thread t = new System.Threading.Thread(() =>
    {

        client.Connect(ip,port );

    });
    t.Start();

和finally块在这里:

    finally
    {
        client.Close();
    }

在这种情况下,主线程在连接完成之前到达finally块。

对象创建和清理真的应该在同一个线程上,所以尝试这样的事情,除非你真的需要关闭。

System.Threading.Thread t = new System.Threading.Thread(() =>
{
    using(TcpClient client = new TcpClient())
    {
        client.Connect(ip, port);
        //followup code here
    }

});
t.Start();

答案 1 :(得分:2)

取决于您要实现的目标,您可以将代码修改为

System.Threading.Thread t = new System.Threading.Thread(() =>
                {
                    using (System.Net.Sockets.TcpClient client = new TcpClient())
                    {
                        client.Connect("127.0.0.1", 80);
                        // Communicate with the Server. 
                    }   // The client object would be disposed here
                });
                t.Start();

请记住,每次线程运行时,此代码都会创建TcpClient的新实例。我假设,您在建立连接后很快就会与服务器通信,然后可以在完成后安全地处理该对象。