c# - tcp客户端在c#中使用超时异步连接
问题描述
我正在寻找一种与超时异步设置 tcpclient 连接的方法,我试图在如何为 TcpClient 设置超时?,但这对我不起作用,我将设置代码放入一个任务中以避免阻塞主线程,需要超时,因为设置过程可能需要超过 1 分钟才能失败。请帮助我使超时工作。
using System;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
namespace test
{
class MainClass
{
public static void Main(string[] args)
{
Connect();
int seconds = 0;
while (true)
{
Console.WriteLine("time elapsed: " + seconds.ToString());
Thread.Sleep(1000);
seconds += 1;
}
}
public static async void Connect()
{
Tcp tcp = new Tcp();
await tcp.BeginConnect("apple.com", 3);
Console.WriteLine("connect end.");
}
}
class Tcp
{
public async Task BeginConnect(string ip, int port)
{
var client = new TcpClient();
Console.WriteLine("start connecting.");
try
{
var succeed = false;
await Task.Run(() =>
{
var result = client.BeginConnect(ip, port, null, null);
succeed = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5)); // timeout doesn't work
client.EndConnect(result);
});
if (succeed && client.Connected)
{
Console.WriteLine("connected to server.");
}
else
{
Console.WriteLine("failed to connect to server.");
}
}
catch (Exception e)
{
Console.WriteLine("exception: " + e.ToString());
}
}
}
}
connect方法没有按预期在5秒后结束,只要抛出异常,client.BeginConnect(ip,port,null,null)之后的代码;永远不会被执行。
解决方案
推荐阅读
- html - 当从显示中显示元素时,Div 不会自动调整高度
- angular - 别名组件
- excel - excel条件格式vlookup不包含值
- unicode - 表情符号作为 MariaDB 主键中的问号
- vim - Vim vim-airline 拆分视图,更改颜色
- unix - 如何使用 SED/AWK 将文本文件中的第一行与最后一行交换
- .net - 将 .NET 核心项目引用到 WCF 时出错
- angular - ngrx store.dispatch 是否可以被限制/去抖动,或者 ngrx 操作是否可以被限制/去抖动?
- reactjs - Getiing 错误 TypeError:使用 React-router 时未定义历史记录
- hibernate - 在 Hibernate 中,我可以从 FetchType.EAGER 交换到 FetchType.LAZY 而不进行任何编码更改