Что имеет смысл использовать отдельный Thread и BeginConnect?
Если вы создаете отдельный поток (желательно с Пул потоков), почему вы используете асинхронное соединение (в этом случае отдельный поток будет взят из пула потоков)?
Есть несколько вариантов:
Используйте ThreadPool и Socket.Connect
class Program {
static void Connect(object o)
{
IPEndPoint address = (IPEndPoint)o;
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(address);
Console.WriteLine("Connected {0}", socket.LocalEndPoint);
socket.Send(Encoding.UTF8.GetBytes("Hello"));
Console.WriteLine("success");
socket.Close();
}
static void Main(string[] args)
{
IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 5111);
ThreadPool.QueueUserWorkItem(Connect, endPoint);
Console.ReadKey();
}
}
Используйте BeginConnect без отдельного потока.
class Program {
static void Main(string[] args)
{
BeginConnect(new IPEndPoint(IPAddress.Loopback, 5111));
Console.ReadKey();
}
public static void BeginConnect(IPEndPoint address)
{
try
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.BeginConnect(address, ConnectCallback, socket);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private static void ConnectCallback(IAsyncResult ar)
{
Socket sock = (Socket)ar.AsyncState;
try
{
sock.EndConnect(ar);
Console.WriteLine("Connected {0}", sock.LocalEndPoint);
sock.Send(Encoding.UTF8.GetBytes("Hello"));
Console.WriteLine("success");
sock.Close();
}
catch (Exception ex)
{
Console.WriteLine("send ex " + ex);
if (sock != null)
sock.Close();
}
}
}
Используйте BeginConnect с отдельным потоком:
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(delegate()
{
BeginConnect(new IPEndPoint(IPAddress.Loopback, 5111));
});
t.Start();
Console.ReadKey();
}
public static void BeginConnect(IPEndPoint address)
{
try
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.BeginConnect(address, ConnectCallback, socket);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private static void ConnectCallback(IAsyncResult ar)
{
Socket sock = (Socket)ar.AsyncState;
try
{
sock.EndConnect(ar);
Console.WriteLine("Connected {0}", sock.LocalEndPoint);
sock.Send(Encoding.UTF8.GetBytes("Hello"));
Console.WriteLine("success");
sock.Close();
}
catch (Exception ex)
{
Console.WriteLine("send ex " + ex);
if (sock != null)
sock.Close();
}
}
}