Я нахожусь в процессе обновления приложения, которое переходит от поддержки одного соединения к возможности поддерживать множество соединений. Я подумал, что использование Task Parallel Library может быть лучшим способом решения этой задачи с точки зрения создания и управления несколькими сокетами. Таким образом, я начал писать код и столкнулся с возможной проблемой при отладке. Кажется, что некоторые из моих задач, которые я создаю для настройки соединений, никогда не выполняются, и мне интересно, правильно ли я использую TPL или это что-то другое. Если я отлаживаю код, создается впечатление, что только одна задача в коллекции содержит Socket. Любая помощь приветствуется. Вот код из консольного приложения песочницы.
Основной:
static void Main(string[] args)
{
Console.WriteLine("Creating connections.....");
var sockets = CreateListeners(5);
Console.WriteLine("Socket Info:");
foreach (var socket in sockets)
{
if (socket.Result != null)
{
var con = socket.Result;
IPEndPoint ipep = (IPEndPoint)con.LocalEndPoint;
string port = ipep.Port.ToString();
Console.WriteLine("Socket #{0} - Listening on Port {1}:", socket.Id.ToString(), port);
}
}
Console.WriteLine("Press any key to exit..");
Console.ReadLine();
}
Функция, которая создает список задач:
private static List<Task<Socket>> CreateListeners(int numberToCreate)
{
var sockets = new List<Task<Socket>>();
for (int n = 0; n < numberToCreate; n++)
{
var currentSocket = Task<Socket>.Factory.StartNew(() => CreateSocketConnection(n));
sockets.Add(currentSocket);
}
return sockets;
}
Функция, которая создает соединение с одним сокетом.
private static Socket CreateSocketConnection(int port)
{
try
{
IPAddress ipAddress = null;
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
if (Socket.OSSupportsIPv6)
{
ipAddress = ipHostInfo.AddressList[1];
}
else
{
ipAddress = ipHostInfo.AddressList[0];
}
//Create a new connection on specified port
IPEndPoint endPoint = new IPEndPoint(ipAddress, port+6000);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(endPoint);
//listener.Blocking = false;
listener.Listen(500);
return listener;
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
return null;
}