通过异步/等待进行服务器通信?

2023-12-14

我想创建通过 async/await 通过 TAP 发送的 Socket 消息。

看完之后这个答案 and this one- 我决定创建一个完全工作的示例:

那么我尝试了什么:

我从以下位置获取了 TAP 扩展方法here(一切正常):我在控制台cmd中测试它:

接收者代码

public static class SocketExtensions
{
    public static Task<int> ReceiveTaskAsync(this Socket socket, byte[] buffer, int offset, int count)
    {
        return Task.Factory.FromAsync<int>(
                         socket.BeginReceive(buffer, offset, count, SocketFlags.None, null, socket),
                         socket.EndReceive);
    }

    public static async Task<byte[]> ReceiveExactTaskAsync(this Socket socket, int len)
    {
        byte[] buf = new byte[len];
        int totalRead = 0;
        do{
            int read = await ReceiveTaskAsync(socket, buf, totalRead, buf.Length - totalRead);
            if (read <= 0) throw new SocketException();
            totalRead += read;
        }while (totalRead != buf.Length);
        return buf;
    }

    public static Task ConnectTaskAsync(this Socket socket, string host, int port)
    {
        return Task.Factory.FromAsync(
                         socket.BeginConnect(host, port, null, null),
                         socket.EndConnect);
    }

    public static Task SendTaskAsync(this Socket socket, byte[] buffer)
    {
        return Task.Factory.FromAsync<int>(
                         socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, null, socket),
                         socket.EndSend);
    }
}
static   void  Main()
{
      Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      s.ConnectTaskAsync("127.0.0.1", 443);


      var buf1 =    s.ReceiveExactTaskAsync(100); //read exactly 100 bytes
      Console.Write(Encoding.UTF8.GetString(buf1.Result)); 

      var buf2 =   s.ReceiveExactTaskAsync(100); //read exactly 100 bytes
      Console.Write(Encoding.UTF8.GetString(buf2.Result));

      Console.ReadLine();
}

发件人代码:

// use same extension method class like above ....^

   void  Main()
    {
     Socket s = new Socket(SocketType.Stream    , ProtocolType.Tcp);
     s.ConnectTaskAsync( "127.0.0.1" , 443);
     s.SendTaskAsync(Encoding.UTF8.GetBytes("hello"));

     s.Close();
     Console.ReadLine();
    }

请注意我删除了async从 main 开始,因为我在控制台中测试它。

问题 ,

根据上面的链接,代码应该可以工作

然而我没有得到任何例外,它只是挂在那条线上:

Console.Write(Encoding.UTF8.GetString(buf1.Result));

(首先我运行接收者,然后运行发送者)

我缺少什么?


问题来自于“请注意,自从我在控制台中测试它以来,我从 main 中删除了异步。".

您需要等待操作完成才能进行下一步。您用作示例的代码在每次暂停await为了完成操作,您的代码将直接执行。

您可以通过放置来解决此问题.Wait()每次操作后都会有一个await或者通过在线程池线程内运行此函数Task.Run(, however我认为最好知道什么时候应该使用异步,什么时候不应该使用异步。

当您有其他工作可以让线程执行时,应该使用异步,很常见的是,“其他工作”是处理 WinForms 项目上的 UI 消息或接受 ASP.NET 站点上的新连接。在控制台应用程序中,程序在等待时无法执行其他工作,因此在这种情况下,使用函数的同步版本会更合适。


P.S. You made the comment after I posted "that's why I remove the async awaits and used Task.result", just so you know never ever1 combine code that uses await and code that blocks the synchronization contest (by using things like Task.Result or Task.Wait(), you will likely cause your code to deadlock and stop functioning!

对于您当前的示例来说,这不是问题,因为控制台应用程序没有同步上下文,但如果您将此代码复制并粘贴到具有同步上下文的内容中,您可以轻松锁定您的程序。

1: Ok, you could combine await and blocking code but there are rules you need to follow, but if you know enough to dispute my what I am saying you know enough to safely do it. If you don't know how to safely do it just avoid doing it

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过异步/等待进行服务器通信? 的相关文章

  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 无法通过脚本更改游戏对象颜色?

    我有一个 UI 画布 其中的图像与画布大小相同 这Image has an rgba of 0 0 0 0 使其不可见 因为a是 0 我想让图像从脚本中淡入黑色 这是我正在使用的代码 public class NavigationC Mon
  • 计算机重新启动后恢复批处理脚本

    我有一堆运行 Windows 2000 Pro 和 IE 5 0 的旧机器 我想将它们升级到带有 Silverlight 的 IE 6 我从微软的网站下载了 IE6 和 Silverlight 安装程序 幸运的是它们都有命令行选项 允许它们
  • 你能在 C# 中编写一段 C++ 代码吗?

    我听说你可以在 C 代码中直接切换到 C 这是怎么做到的 还是我听错了 注意 我的意思不是 C CLI 你可能会想unsafe blocks您可以在其中编写看起来很像 C 的代码 因为您可以使用指针
  • 如何在 JavaScript 中快速播放声音文件的多个副本

    我正在用 html js 构建一个旋转得相当快的命运之轮 每当一种新的颜色飞过标记时 色轮就会发出咔哒声 在最高速度下 这听起来几乎就像一挺机关枪 因此在旧文件基本上完成之前就开始播放新文件 文件本身始终相同 click wav 它在 Ch
  • 如何在Javascript中使用字符串作为变量名? [复制]

    这个问题在这里已经有答案了 可能的重复 有没有办法使用包含变量名称的字符串来访问 JavaScript 变量 JavaScript 通过名称字符串动态获取局部变量 一个简单的代码来说明我的问题 var chat 1 one var chat
  • 如何理解普通函数和箭头函数中的“this”?

    我想加载远程图像以获取其高度和宽度 但得到不同的结果 下面的代码给了我正确的图像高度和宽度 img onload function console log image this width this height ctx drawImage
  • 绕过“选项请求”的身份验证(因此所有标头都在响应中发送)

    这是在跨源资源共享的背景下 对于预检请求 服务器不会发送标头集 当 选项请求 未传递有效的 cookie 时 其响应中的服务器不会发送我设置的标头 但会发送 200 OK 我用curl检查了这一点 如下所示 显然 我在这里用虚拟的 xyza
  • 替代 SocketUtils.findAvailableTcpPort()?

    以下初始化为套接字spring integration在专用端口上 目标是给应用程序 2 分钟的时间在该端口上运行 否则失败就是不成功 但应用程序启动应该not fail directly该端口在启动时不是空闲的 Configuration
  • WordPress 网站速度慢得令人痛苦

    有哪些工具可以确定网站加载页面的时间如此之长的原因 我正在使用一个非常简单的主题 我对其进行了更改以满足我的需求 这是一个全新的网站 只有两个测试帖子 并且需要一段时间才能加载 我使用 YSlow for Firebug 它为该网站提供了
  • 使用编译 'com.google.android.support:wearable:2.0.4' 时出现以下错误,但我没有使用 26.0.0

    使用时compile com google android support wearable 2 0 4 最新版本com google android support wearable 在我的 Wear 应用程序的 build gradle
  • rgl 矢量图:显示正交向量的直角

    In the matlib包裹 https github com Friendly matlib 我有一个函数 vectors3d 绘制几何矢量图 下面的代码给出了一个显示单位向量 J 的示例图 以及它在 X Y Z 轴上的一些投影 在致电
  • 将模型对象列表发布到 ASP.NET MVC 中的控制器

    像这样的形式 视图模型 public class ProductViewModel public string Product get set public IEnumerable
  • 带有 html5Mode 的 Angular 路线在重新加载后给出“未找到”页面

    我制作了一些 Angular 路线 如下面的代码所示 app config function routeProvider locationProvider provide routeProvider when templateUrl hom
  • chrome 扩展 - ip 域权限

    我的 Chrome 扩展程序需要向我的家庭 LAN 上的服务器发送请求 但我没有 DNS 设置 因此我对所有内容都使用原始 IP 我通过我的后台页面发送这些请求 因此在清单文件中具有适当的权限 它应该允许我这样做 这就是我在清单中的内容 p
  • 如何将时间转换为iPhone设备的时区?

    我在 EST 时区有一个时间 它是使用 mysql 服务器上的 NOW 函数完成的 因为我的服务器位于东部时间 所以存储的时间是东部时间 当我从 iPhone 上的应用程序检索它时 我需要以用户的正确时区显示它 我怎么做 我认为这取决于您所
  • Python isalpha() 和 scandics

    有没有办法让 python isalpha 方法理解 scandics 我已经尝试过以下方法 gt gt gt import locale gt gt gt locale getlocale None None gt gt gt thisi
  • 如何使用 boto 将文件从 Amazon S3 流式传输到 Rackspace Cloudfiles?

    我正在将文件从 S3 复制到 Cloudfiles 并且我想避免将该文件写入磁盘 Python Cloudfiles 库有一个 object stream 调用 看起来正是我所需要的 但我在 boto 中找不到等效的调用 我希望我能够做类似
  • 优化 R 中的 Apply()

    以下代码的目标是对具有 400 列和 6000 行的数据集执行递归和迭代分析 它一次需要两列并对其进行分析 然后再转向所有可能的组合 正在使用的大数据集的小子集 data1 data2 data3 data4 0 710003 0 7142
  • Tweepy 涉及解析要求的安装错误

    我一直在尝试安装tweepy在 Windows 上 它会返回错误 具体来说 它说 类型错误 parse requirements 得到意外的关键字参数 session 我的安装代码是 pip 安装 tweepy 任何帮助将不胜感激 我不确定
  • 通过异步/等待进行服务器通信?

    我想创建通过 async await 通过 TAP 发送的 Socket 消息 看完之后这个答案 and this one 我决定创建一个完全工作的示例 那么我尝试了什么 我从以下位置获取了 TAP 扩展方法here 一切正常 我在控制台c