明显的 BufferBlock.Post/Receive/ReceiveAsync 竞赛/bug

2024-02-21

交叉发布到http://social.msdn.microsoft.com/Forums/en-US/tpldataflow/thread/89b3f71d-3777-4fad-9c11-50d8dc81a4a9 http://social.msdn.microsoft.com/Forums/en-US/tpldataflow/thread/89b3f71d-3777-4fad-9c11-50d8dc81a4a9

我知道...我并没有真正发挥 TplDataflow 的最大潜力。我只是使用 ATMBufferBlock作为消息传递的安全队列,生产者和消费者以不同的速率运行。我看到一些奇怪的行为,让我不知道如何 继续。

private BufferBlock<object> messageQueue = new BufferBlock<object>();

public void Send(object message)
{
    var accepted=messageQueue.Post(message);
    logger.Info("Send message was called qlen = {0} accepted={1}",
    messageQueue.Count,accepted);
}

public async Task<object> GetMessageAsync()
{
    try
    {
        var m = await messageQueue.ReceiveAsync(TimeSpan.FromSeconds(30));
        //despite messageQueue.Count>0 next line 
        //occasionally does not execute
        logger.Info("message received");
        //.......
    }
    catch(TimeoutException)
    {
        //do something
    }
}

在上面的代码中(这是 2000 行分布式解决方案的一部分),Send每 100 毫秒左右定期调用一次。这意味着一个项目是Posted to messageQueue每秒大约10次。这是经过验证的。然而,偶尔会出现这样的情况ReceiveAsync未在超时时间内完成(即Post没有造成ReceiveAsync完成)和TimeoutException30岁后被提升。在此刻,messageQueue.Count有数百个。这是出乎意料的。在较慢的发布速度(1 个帖子/秒)下也观察到此问题,并且通常发生在 1000 个项目通过之前BufferBlock.

因此,为了解决这个问题,我使用以下代码,该代码可以工作,但偶尔会在接收时导致 1 秒延迟(由于出现上述错误)

    public async Task<object> GetMessageAsync()
    {
        try
        {
            object m;
            var attempts = 0;
            for (; ; )
            {
                try
                {
                    m = await messageQueue.ReceiveAsync(TimeSpan.FromSeconds(1));
                }
                catch (TimeoutException)
                {
                    attempts++;
                    if (attempts >= 30) throw;
                    continue;
                }
                break;

            }

            logger.Info("message received");
            //.......
        }
        catch(TimeoutException)
        {
            //do something
        }
   }

对我来说,这看起来像是 TDF 中的竞争条件,但我无法弄清楚为什么在我使用的其他地方不会发生这种情况BufferBlock以类似的方式。实验性地改变自ReceiveAsync to Receive没有帮助。我还没有检查过,但我想单独来看,上面的代码可以完美地工作。这是我在“TPL 数据流简介”中看到的一种模式tpl数据流.docx http://www.microsoft.com/download/en/details.aspx?id=14782.

我该怎么做才能查清真相?是否有任何指标可以帮助推断正在发生的情况?如果我无法创建可靠的测试用例,我还能提供哪些信息?

Help!


斯蒂芬似乎认为以下是解决方案

var m =等待messageQueue.ReceiveAsync();

代替:

var m =等待messageQueue.ReceiveAsync(TimeSpan.FromSeconds(30));

你能否证实或否认这一点?

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

明显的 BufferBlock.Post/Receive/ReceiveAsync 竞赛/bug 的相关文章

随机推荐

  • Facebook 画布应用程序“redirect_uri”在授权和身份验证后突破 iframe

    我正在升级我现有的 FB 应用程序 并且非常疯狂地尝试获得一个简单的 PHP iframe 画布应用程序来授权和身份验证 以及使用 SSL 从来没有看过这么多例子 这就是我陷入困境的地方 用户授权应用程序并且应用程序对用户进行身份验证后 我
  • 如何从浏览器将用户重定向到 Google Play 上应用页面的评论选项卡?

    我在 Google Play 上发布了一个应用程序 我想要一个将用户重定向到 google play 上应用程序页面上的评论选项卡的网址 在发布应用程序的文档中 有一个用于将用户重定向到应用程序的详细信息选项卡 默认 的 url 我希望当用
  • 如何在数组中查找大于、小于或等于某个值的数字?

    我试图输出小于 5 的值和大于数组中所有值的平均值的值 我不知道如何使这一切顺利进行并输出正确的数字 有人可以帮忙吗 这就是我所拥有的 我快到了 我只是不知道我做错了什么 int numbers 2 4 6 8 10 12 14 16 in
  • PrimeFaces p:focus on p:dataTable 元素

    我目前正在尝试设置一个可编辑的数据表 当用户使用 JavaScript 或支持 bean 编辑单元格时 该表使用 ajax 来保持焦点 因为当发生单元格编辑时 表的其他部分中的数据将需要更新 因此应重新绘制表格 使焦点元素失去焦点 目前我正
  • Matlab fft 函数交换索引

    我编写了一个简单且非常小的 Matlab 代码 用于计算给定数组 或向量 的离散傅里叶变换 我手动计算出来并得到了答案 我的 Matlab 代码也给出了相同的答案 但fft通过交换索引给出了与此不同的答案 以下是我所做的手动计算 这是第二张
  • 如何更改 Windows 控制台应用程序中的文本或背景颜色

    哪个 C 函数更改文本或背景颜色 MS Visual studio 例如cout lt lt This text 如何将 此文本 设为红色 您可以使用 Win32 更改控制台应用程序的颜色 以下是有关如何操作的示例 include stda
  • 关于 WSO2 API Manager 数据源

    我现在正在执行 WSO2 API 管理器 Analytics 2 0 POC 当我将数据源从 H2 更改为 Oracle 时 在 wso2am 2 0 1 SNAPSHOT 中 有 2 个数据源配置文件 master datasources
  • EF EntityCollection 中的更改通知

    在 Silverlight 4 项目中 我使用 WCF RIA 服务 MVVM 原则和 EF 4 我遇到了这种情况 创建了一个名为 Category 的实体和另一个名为 CategoryLocale 的实体 使用 VS 自动执行 没有 PO
  • 修复 Tomcat 8 上的错误代码:ssl_error_no_cypher_overlap

    我有一个便宜的 SSL 证书 我想用 Tomcat 8 0 26 配置它 我在 Linux 上运行以下命令来创建密钥库 root cert keytool import alias root keystore tomcat jks trus
  • 为哈希选择合适的表大小

    如果我有一个 1000 个键集 我的哈希表的合适大小是多少 如何确定 它取决于负载系数 表将增加其大小并重新分布其元素的 满百分比 点 如果您知道正好有 1000 个条目 并且该数字永远不会改变 则只需将负载因子设置为 1 0 将初始大小设
  • 使用 VBA 删除 Excel 中的工作表和数据透视表

    我正在尝试在 VBA 中集成功率枢轴和枢轴图表的创建 并已经完成了很大一部分 然而 我遇到了一个我似乎无法克服的问题 我创建新的工作表 在其中创建数据透视并将其导出为 PDF 完成后 我删除数据透视表和工作表 Sub DeleteAllPi
  • 在 Python 中测试所有组合

    我有两组选择 optionList1 a1 a2 a3 an optionList2 b1 b2 b3 bn 选项列表中的元素数量不一定相等 我必须从第一个选项列表中选择两次 如何确保我已尝试了第一个列表中的 2 个选项和第二个列表中的一个
  • 如何从外部函数更改局部静态变量值

    include
  • JQuery .ressized,如何为alsoResize属性选择子级

    我有弹出的窗口 可以拖动和调整大小 一切都很好 除了我需要调整大小窗口来调整其中的 div 大小 这可以通过设置轻松完成alsoResize selector 但是 此窗口的每个实例都具有相同的 div 和相同的类名 如果调整一个窗口的大小
  • openOptionsMenu 不适用于全屏

    我有一个全屏模式的活动 android theme android style Theme NoTitleBar Fullscreen 我用按钮打开选项菜单 dmenu setOnClickListener new OnClickListe
  • ggsurvplot - 轴交叉于 0,0

    Survminer产生不错的情节 但有没有办法进一步改变常规的结果ggplot 命令 我尝试做的是使 y 轴从原点开始 如上所述here https stackoverflow com questions 13701347 force th
  • 使用 ObjectDB 搜索空用户数据库时出现问题

    我正在创建一个 java 应用程序 它使用 ObjectDB 来创建和维护一组数据库 我目前正在尝试实现一个数据库来存储由用户名和密码字符串组成的用户对象 在 JFrame swing 类上 我有一个用于创建新用户的按钮 单击此按钮时 我希
  • 通过周围像素的平均值去除图像中的孔

    任何人都可以帮助我用从相邻非零像素获取的值来填充这些黑洞 谢谢 做到这一点的一个好方法是解决线性热方程 http en wikipedia org wiki Heat equation 你要做的就是修复好区域像素的 温度 强度 让热量流入坏
  • 基本 Node.js 项目的“属性‘程序’不存在”

    我创建了简单的node js应用程序 源代码来自这里https azure microsoft com en us blog visual studio code and azure app service a perfect fit ht
  • 明显的 BufferBlock.Post/Receive/ReceiveAsync 竞赛/bug

    交叉发布到http social msdn microsoft com Forums en US tpldataflow thread 89b3f71d 3777 4fad 9c11 50d8dc81a4a9 http social msd