gpt4 book ai didi

C# await TcpClient ConnectAsync/ReadToEndAsync 超时

转载 作者:行者123 更新时间:2023-11-30 23:32:49 24 4
gpt4 key购买 nike

我正在使用 .NET 4.5 构建一个 SOCKS 代理检查器,一切正常,除非其中一个 SOCKS 代理非常慢并且需要 100 多秒才能响应。我想在几个阶段(ConnectAsync、ReadToEndAsync)使这些代理超时,尤其是在 ReadToEndAsync 时,因为如果代理很慢,它就会挂起。

我已经尝试了所有我能找到的关于这个的东西,使用取消标记、Task.Wait、NetworkStream.ReadTimeout(不起作用..奇怪)..如果我使用 Task.Wait,那么我就不能使用 await 关键字,这使得它同步而不是异步,这打败了我的工具的整个想法..

 var socksClient = new Socks5ProxyClient(IP,Port);
var googleAddress = await Dns.GetHostAddressesAsync("google.com");
var speedStopwatch = Stopwatch.StartNew();
using(var socksTcpClient = await socksClient.CreateConnection(googleAddress[0].ToString(),80))
{

if(socksTcpClient.Connected)
{
using(var socksTcpStream = socksTcpClient.GetStream())
{
socksTcpStream.ReadTimeout = 5000;
socksTcpStream.WriteTimeout = 5000; //these don't work..
using (var writer = new StreamWriter(socksTcpStream))
{

await writer.WriteAsync("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n");
await writer.FlushAsync();
using (var reader = new StreamReader(socksTcpStream))
{
var result = await reader.ReadToEndAsync(); // up to 250 seconds hang on thread that is checking current proxy..



reader.Close();
writer.Close();
socksTcpStream.Close();
}
}
}
}
}

最佳答案

遗憾的是,异步套接字 IO 不支持超时。你需要自己构建它。这是我所知道的最佳方法:

让你的整个函数不关心超时。禁用所有这些。然后,启动一个延迟任务,并在它完成时处理套接字。这会杀死所有正在运行的 IO 并立即取消。

所以你可以这样做:

Task.Delay(TimeSpan.FromSeconds(100)).ContinueWith(_ => socksTcpClient.Dispose());

这会导致丑陋的 ObjectDisposedException。这是不可避免的。

如果成功,可能需要取消延迟。否则,您将大量延迟任务保留 100 秒,根据负载的不同,它们可能达到数百万。

关于C# await TcpClient ConnectAsync/ReadToEndAsync 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34166511/

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