使用 Wait() 时 StreamSocket.InputStreamOptions.ReadAsync 挂起

2023-12-24

这是我能够准备的最小可能场景:

  • 此代码连接到 imap.gmail.com
  • 读取初始服务器问候语(使用 Read 方法)
  • 发送NOOP命令(NO操作)
  • 读取 NOOP 命令响应(再次使用 Read 方法)

问题是第二次读取挂起。如果使用“await ReadAsync”,它会完美工作。

当我中断程序时,我可以看到调用堆栈从task.Wait()开始,到System.Threading.Monitor.Wait()结束。

如果我一步步调试,它不会挂起。我必须承认它看起来像一个 .NET 框架错误,但也许我遗漏了一些明显的东西。

private static async Task<byte[]> ReadAsync(StreamSocket socket)
{
    // all responses are smaller that 1024
    IBuffer buffer = new byte[1024].AsBuffer();
    await socket.InputStream.ReadAsync(
            buffer, buffer.Capacity, InputStreamOptions.Partial);
    return buffer.ToArray();
}

private static byte[] Read(StreamSocket socket)
{
    Task<byte[]> task = ReadAsync(socket);
    task.Wait();
    return task.Result;
}

private async void Button_Click(object sender, RoutedEventArgs e)
{
    Encoding encoding = Encoding.GetEncoding("Windows-1250");

    using (StreamSocket socket = new StreamSocket())
    {
        await socket.ConnectAsync(
            new HostName("imap.gmail.com"), "993", SocketProtectionLevel.Ssl);

        // notice we are using Wait() version here without any problems:
        byte[] serverGreetings = Read(socket);              

        await socket.OutputStream.WriteAsync(
            encoding.GetBytes("A0001 NOOP\r\n").AsBuffer());
        await socket.OutputStream.FlushAsync();

        //byte[] noopResponse = await ReadAsync(socket);    // works
        byte[] noopResponse = Read(socket);                 // hangs
    }
}

我解释一下这个僵局的原因在我最近的 MSDN 文章中 http://msdn.microsoft.com/en-us/magazine/jj991977.aspx在我的博客上 http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html.

简短的回答是你不是supposed打电话Wait or Result on async代码;你应该使用await一路走来。

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

使用 Wait() 时 StreamSocket.InputStreamOptions.ReadAsync 挂起 的相关文章

随机推荐

  • 从远程 Git 存储库中删除所有文件和历史记录,而不删除存储库本身

    如果有人能告诉我如何删除 git 存储库上的每个文件 文件夹而不实际删除存储库本身 我将不胜感激 我也想删除与这些文件相关的所有历史记录 正如我所解释的这个答案 https stackoverflow com questions 18112
  • 将图像文件保存到临时目录

    我有一个名为 Image png 的图像文件 它保存在我的主包中 位于项目导航器层次结构中的 ViewController swift 文件旁边 我想将此图像的副本保存到临时目录 我以前没有做过 请问我可以使用什么代码 像这样的事情应该可以
  • scrapy 不打印异常的堆栈跟踪

    是否有一种特殊的机制来强制 scrapy 打印出所有 python 异常 堆栈跟踪 我犯了一个简单的错误 错误地获取了列表属性 导致 AttributeError 没有在日志中完整显示 出现的是 2015 11 15 22 13 50 sc
  • LinqKit 谓词生成器抛出 TypeLoadException?

    我在尝试执行使用 PredicateBuilder 动态构建的查询时遇到问题 我能够构建查询 但是在执行查询本身时 我得到以下 TypeLoadException 运行时 return context SearchRecords AsExp
  • 在Python中使用libclang解析C++

    经过一些研究和几个问题后 我最终探索了libclang https pypi python org pypi clang 3 5库以便在 Python 中解析 C 源文件 给定一个 C 源代码 int fac int n return n
  • 没有模板参数的模板类的容器

    我想知道您是否可以拥有一个包含具有不同模板参数的对象的容器 我正在努力实现这样的目标 include
  • 单击时发生指针事件,但滚动时不发生指针事件

    是否可以允许单击但不允许滚动事件 pointer events none 将禁用两种类型的输入 我想仅禁用滚动 还有其他解决方法的想法吗 添加这个CSS stopScroll height 100 overflow hidden 然后在 j
  • 如何判断线段是否在多边形内部?

    我们有一个线段L由两点定义从多边形和一个多边形P由 4 个或更多点定义 我需要一个算法来确定是否L在里面P 编辑 线段必须完全位于多边形内部 如果仅部分位于多边形内部 则将其定义为外部 例如看下图 再举几个例子 Step 1 L 是否穿过
  • 关于 addBatch(String) 的注意事项

    旁边的addBatch 的方法PreparedStatement还有一个addBatch String 方法中的Statement class 我想处理一系列不同的 sql 语句 并且正在寻找有关 addBatch String 性能方面含
  • id 为“xxxx”的进程未在 Visual Studio 中运行(包括 2013 至 2017~ 版本)

    我无法从 Visual Studio 2013 运行任何应用程序 它会抛出 ID 为 xxxx 的进程未运行消息 我也用过 Telerik 我尝试了互联网上的所有解决方案 除了重新安装 Visual Studio 但没有任何帮助 请帮助 谢
  • 如何在 Java 中复制 PostgreSQL 的 uuid_generate_v3()?

    PostgreSQL create extension if not exists uuid ossp select uuid generate v3 uuid nil this is a test uuid generate v3 e1e
  • 电路如何再次闭合?

    我正在尝试理解 Hystrix 据我所知 当服务调用第三方服务并且该服务没有响应并且阈值已超过配置时 电路将被打开 并且后续呼叫将被短路 但我无法理解电路如何再次闭合 让我们假设我们的服务正在调用第三方服务 并且该服务无法正常工作 因此电路
  • 在 Mac OS X 中修改窗口按钮颜色

    如何修改 Mac OS X 中用于关闭 最小化 缩放的红色 黄色 绿色窗口按钮 某处必须有可编辑的资源或 plist 以下是我正在谈论的按钮 对于红 绿色色盲的人来说 这些颜色可能会让人抓狂 我希望他们选择交通灯中使用的真正的蓝色阴影 而不
  • 具有自定义 bin 边缘的 ggplot2 密度直方图

    我能够绘制密度直方图 并且能够使用自定义箱绘制常规直方图 但不能同时绘制两者 这是我的尝试 library ggplot2 vals c 2 6 5 2 4 1 6 9 5 7 5 2 4 4 5 5 6 3 6 1 4 7 1 4 myp
  • 包括静态库到./configure

    如何在执行命令时包含两个静态库 configure Ex configure prefix usr LDFLAGS L home lancy dictionary src WordNet 3 0 lib lWN 这里只包含一个静态库 我如何
  • 问题使用 msbuild 构建具有多个配置的单个项目

    Issue 我们在解决方案中使用配置转换 例如 调试 测试 登台 发布 但是 这些配置仅用于我们的 MVC 项目 所有的库只使用调试和发布 这更有意义 因为我们的库只需要在调试模式或发布模式下构建 尝试从命令行构建单个项目时会出现此问题 我
  • 在 Angular 13 中实现 Monaco 编辑器

    在 Angular 13 中实现 Monaco 编辑器的最佳选择是什么 我见过 ngx monaco editor 但上次更新是 9 个月 它已经升级到 Angular 12 Monaco 版本也有 0 20 0 11 02 2020 非常
  • 为什么我需要避免在循环内使用 try-catch-finally

    每次执行 catch 子句 将捕获的异常对象分配给变量 时 try catch finally 构造都会在运行时在当前作用域中创建一个新变量 而不是使用 var object foo bar i for i 0 len object len
  • 是否有针对 ASP.NET MVC 的分页解决方案在数据库中进行分页?

    我通过谷歌搜索发现的大多数 ASP NET MVC 分页解决方案看起来都以 IEnumerable 集合的形式从数据库表中获取所有行 对 IEnumerable 集合执行一些分页转换 然后将结果返回到视图 我希望能够在数据库端进行分页 但仍
  • 使用 Wait() 时 StreamSocket.InputStreamOptions.ReadAsync 挂起

    这是我能够准备的最小可能场景 此代码连接到 imap gmail com 读取初始服务器问候语 使用 Read 方法 发送NOOP命令 NO操作 读取 NOOP 命令响应 再次使用 Read 方法 问题是第二次读取挂起 如果使用 await