gpt4 book ai didi

c# - 是使用TPL创建过多的套接字集合,还是有更好的方法来创建多个套接字?

转载 作者:行者123 更新时间:2023-12-03 11:58:33 24 4
gpt4 key购买 nike

我正在更新一个应用程序,该应用程序将从支持单个连接变为能够支持多个连接。我已经发现,就创建和管理多个套接字而言,使用任务并行库可能是实现此目的的最佳方法。因此,我已经开始编写一些代码,并且在调试时遇到了可能的问题。我创建的用于建立连接的某些任务似乎从未完成,并且想知道我是否在正确地使用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;
}

最佳答案

您的问题似乎是您正在启动异步任务,但不等待它们完成,然后再查询它们的结果。

CreateListeners调用之后,您知道已经开始了5个任务。您让任务库决定并行性或顺序。

因此,您需要先调用socket.Wait();,然后再调用if (socket.Result != null),因为如果尚未完成,它很可能为null。

正如VirtualBlackFox所说,如果认为适当的话,很可能会按顺序执行它们,这可能意味着当您开始查询结果时,只有一项任务已经完成。

作为一个普遍的答案,对我来说使用并行操作进行操作似乎并不过分。 IO类型的操作通常会从并行中受益匪浅,因为它们涉及大量的开销。

关于c# - 是使用TPL创建过多的套接字集合,还是有更好的方法来创建多个套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com