我尝试测试套接字连接。它显示错误
无法访问已处置的对象。 对象名:'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();
}
答案 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
的新实例。我假设,您在建立连接后很快就会与服务器通信,然后可以在完成后安全地处理该对象。