【问题标题】:async- await until someone tries to connect异步 - 等待直到有人尝试连接
【发布时间】:2014-06-28 23:07:33
【问题描述】:

我想创建一个等待有人尝试连接的异步方法 看起来像的东西

await (listener.Pending() == true);

当然,那是行不通的。 我该怎么做?

【问题讨论】:

标签: c# sockets asynchronous listener async-await


【解决方案1】:

如果您可以使用 async/await,那么您可能正在使用 .NET 4.5。如果是这样,您可以在TcpListener 上使用AcceptSocketAsyncAcceptTcpClientAsync 方法吗?例如:

await listener.AcceptSocketAsync();

Pending 方法与这两个方法执行相同的检查,但只是立即返回 true/false。这两个Accept...Async 被设计为阻塞直到Pending 否则会返回true,然后分别交给你你的SocketTcpClient

背景

来自Pending 文档:

这种非阻塞方法确定是否有任何挂起的连接请求。因为 AcceptSocket 和 AcceptTcpClient 方法会阻止执行,直到 Start 方法将传入的连接请求排队,所以 Pending 方法可用于在尝试接受连接之前确定连接是否可用。

Accept...Async 方法与Accept... 版本相同,但您可以await 它们。

【讨论】:

  • 我应该使用它来代替普通的 AcceptSocket() 吗?比如:socket = await listener.AcceptSocketAsync();我只是不知道这个选项。可能会成功,谢谢
  • AcceptSocketAsync 只是一种方便的异步阻塞方法,它允许您使用await 等待,而不是使用自己的技巧等待AcceptSocket 返回套接字。
【解决方案2】:

您可以从Begin\EndAccept 创建一个Task

var listener = new TcpListener(...);
Task<Socket> acceptTask = Task.Factory.FromAsync<Socket>(listener.BeginAcceptSocket, listener.EndAcceptSocket, null);

var socket = await acceptTask;

【讨论】:

  • 我喜欢 FromAsync 辅助函数,但在 .NET 4.5 中,我会纯粹为了简洁而使用我的答案。值得强调的是,您的答案将适用于我需要 .NET 4.5 的 .NET 4。
  • 这正是 TcpListner 在内部所做的。
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 2019-10-20
  • 2020-08-06
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
相关资源
最近更新 更多