【问题标题】:Is there a TPL (Async/Await) based socket abstraction?是否有基于 TPL(异步/等待)的套接字抽象?
【发布时间】:2016-01-29 04:33:16
【问题描述】:

我需要编写一个 TCP 客户端来与服务器通信。查看代码示例(Socket、TcpClient?),考虑到我在 C# 冒险中其他地方看到的情况,我似乎无法找到任何感觉像“现代”的方法来解决这个问题。

我想我特别希望看到像 await socket.Connect(args) 这样的任务和代码,但我看到的是基于回调的异步或 BeginX 方法...

在这里,我有哪些选择?我是继续使用它并在没有 TPL 的情况下使用某些东西,还是有其他方法?

非常感谢!

【问题讨论】:

  • 看看这个SO answer。您还可以查看 Stephen Toub 在其博客上的 Awaiting Socket Operations 文章。
  • 所有这些样本都很糟糕。既然 await 存在,就永远不要使用带有 APM 模式的套接字!另外,质疑你是否需要异步。同步 IO 更简单。

标签: c# .net


【解决方案1】:

没有 TAP-based 原始套接字 API,没有。我相信 BCL 团队查看了 Socket class - 它已经支持完整的同步 API 和 两个 完整的异步 API - 并决定添加第三个完整的异步 API 太过分了。

use Task.Factory.FromAsync to wrap the existing Begin/End methods 很容易。就个人而言,我喜欢使用扩展方法来做到这一点,以便更自然地调用它们。

但首先你应该退后一步,看看是否有任何方法可以避免使用原始套接字。特别是,看看 SignalR 是否可行。编写正确的原始套接字代码极其困难,而使用更高级别的抽象会容易得多。

【讨论】:

  • 但没有一半的乐趣!这不是任何关键任务 - 我真的很想成为一个可以编写棘手的套接字代码的人,所以我认为这是一个不错的小项目。感谢您在这里提供的提示 - 以及您在网上其他各种著作中没有直接给我的帮助!
  • @ledneb:在这种情况下,我有一个TCP/IP FAQ 可以帮助你。祝你好运!
  • 我没有遇到过,看起来真的很有用。再次感谢斯蒂芬 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2020-01-28
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多