我试图使用以下代码检查到本地主机TCP服务器(ActiveMQ代理)的TCP连接:
string host = "localhost";
int port = 61616;
using (TcpClient tcpClient = new TcpClient())
{
try
{
Task t = Task.Run(() => {
tcpClient.Connect(host, port);
});
Console.WriteLine("Connected.");
TimeSpan ts = TimeSpan.FromMilliseconds(150);
if (!t.Wait(ts))
{
Console.WriteLine("The timeout interval elapsed.");
Console.WriteLine("Could not connect to: {0}", port);// ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Port.ToString());
}
else
{
Console.WriteLine("Port {0} open.", port);
}
}
catch (UnauthorizedAccessException )
{
Console.WriteLine("Caught unauthorized access exception-await behavior");
}
catch (AggregateException )
{
Console.WriteLine("Caught aggregate exception-Task.Wait behavior");
}我停止了本地主机服务器(ActiveMQ broker),并尝试运行上述代码。它把System.AggregateException扔了。当我启动服务器并运行代码时,它将连接到服务器。
根据documentation of TcpClient.Connect的说法,它将抛出以下内容之一:
ArgumentNullExceptionArgumentOutOfRangeExceptionSocketExceptionObjectDisposedExceptionSecurityExceptionNotSupportedException为什么要抛出System.AggregateException
发布于 2019-12-12 17:08:00
这
Task t = Task.Run(() => {
tcpClient.Connect(host, port);
});包装您的.Connect()电话。Task.Run()总是向AggregateException抛出真正的异常。为了解决这个问题,要么检查异常,要么更好地使用.Connect()的异步变体
Task t = tcpClient.ConnectAsync(host, port);而不是。
发布于 2019-12-12 19:06:26
我最后做的是:
tcpClient.ReceiveTimeout = 5000;
tcpClient.SendTimeout = 5000;
tcpClient.Connect(host, port);
catch (SocketException) {
Console.WriteLine("Could not connect to: {0}", port);
Console.WriteLine("Socket exception. Check host address and port.");
}好像起作用了。
https://stackoverflow.com/questions/59309236
复制相似问题