gpt4 book ai didi

c# - 挂断异步 TCP 客户端连接

转载 作者:行者123 更新时间:2023-11-30 16:28:39 24 4
gpt4 key购买 nike

我正在练习异步 CTP 框架,作为练习,我将创建一个能够查询服务器(使用任意协议(protocol))的 TCP 客户端。无论如何,由于连接问题,我还停留在早期阶段。要么我还没有理解一些基本点,要么有一些奇怪的东西。

所以,这是异步连接器:

public class TaskClient
{
public static Task<TcpClient> Connect(IPEndPoint endPoint)
{
//create a tcp client
var client = new TcpClient(AddressFamily.InterNetwork);

//define a function to return the client
Func<IAsyncResult, TcpClient> em = iar =>
{
var c = (TcpClient)iar.AsyncState;
c.EndConnect(iar);
return c;
};

//create a task to connect the end-point async
var t = Task<TcpClient>.Factory.FromAsync(
client.BeginConnect,
em,
endPoint.Address.ToString(),
endPoint.Port,
client);

return t;
}
}

我的意思是只调用此函数一次,然后返回一个 TcpClient 实例以用于任何后续查询(此处未显示代码)。

在我的表单中的某处,我按如下方式调用上面的函数:

    //this method runs on the UI thread, so can't block
private void TryConnect()
{
//create the end-point
var ep = new IPEndPoint(
IPAddress.Parse("192.168.14.112"), //this is not reachable: correct!
1601);

var t = TaskClient
.Connect(ep)
.ContinueWith<TcpClient>(_ =>
{
//tell me what's up
if (_.IsFaulted)
Console.WriteLine(_.Exception);
else
Console.WriteLine(_.Result.Connected);

return _.Result;
})
.ContinueWith(_ => _.Result.Close());

Console.WriteLine("connection in progress...");

//wait for 2" then abort the connection
//Thread.Sleep(2000);
//t.Result.Client.Close();
}

测试是尝试连接远程服务器,但必须无法访问(PC 开启,但服务已停止)。

当我运行 TryConnect 函数时,它立即正确返回“connection in progress...”,然后显示异常,因为远程端点已关闭。太棒了!

问题是返回异常需要几秒,我想给用户机会取消正在进行的操作。根据有关 BeginConnect 方法的 MSDN 规范,如果您希望中止异步操作,只需在工作套接字上调用 Close。

因此,我尝试在末尾添加几行(如上注释掉),以模拟用户在 2 秒后取消。结果看起来像是应用程序的挂起(沙漏)。通过暂停 IDE,它会在最后一行 t.Result.Client.Close() 处停止。但是,通过停止 IDE,一切都会正常关闭,没有任何异常。

我也尝试过直接关闭客户端,如t.Result.Close(),但完全一样。

是我的问题,还是连接过程有什么问题?

非常感谢。

最佳答案

t.Result.Close() 将等待 t 任务完成。t.ContinueWith() 也会等待任务完成。

要取消,您必须等待 2 个任务:tcp 和计时器。
使用异步 tcp 语法:

await Task.WhenAny(t,Task.Delay(QueryTimeout));
if (!t.IsCompleted)
tcpClient.Close(); //Cancel task

关于c# - 挂断异步 TCP 客户端连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6897482/

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