ApparentBufferBlock.Post/Receive/ReceiveAsyncRace/ErrorCrossPosttohttp://social.msdn.microsoft.com/Forums/en-US/tpldataflow/thread/89b3f71d-3777-4fad-9c11-50d8dc81a4a9我知道...我并没有真正充分发挥TplDataflow的潜力。ATM我只是将BufferBlock用作消息传递的安全队列,其中生产者和消费者以不同的速率运行。我看到一些奇怪的行为让我困惑如何继续。privateBufferBlockmessageQueue=newBufferBlock();publicvoidSend(objectmessage){varaccepted=messageQueue.Post(message);logger.Info("发送消息被调用qlen={0}accepted={1}",messageQueue.Count,accepted);}publicasyncTaskGetMessageAsync(){try{varm=awaitmessageQueue.ReceiveAsync(TimeSpan.FromSeconds(30));//尽管messageQueue.Count>0下一行//偶尔不执行logger.Info("messagereceived");//.....}catch(TimeoutException){//dosomething}}在上面的代码中(这是一个2000行分布式解决方案的一部分),每隔100毫秒左右定期调用Send。这意味着一个项目每秒大约10次发送到messageQueue。这已经得到验证。但是,偶尔看起来ReceiveAsync没有在超时内完成(即Post不会导致ReceiveAsync完成)并且TimeoutException在30秒后抛出。此时,messageQueue.Count为数百。这是出乎意料的。当发布速度较慢(1个帖子/秒)时也会观察到此问题,并且通常在1000个项目通过BufferBlock之前发生。所以,为了解决这个问题,我使用了下面的代码,它可以工作,但偶尔会导致接收延迟1秒(由于上面发生的错误)publicasyncTaskGetMessageAsync(){try{objectm;变种尝试=0;对于(;;){try{m=awaitmessageQueue.ReceiveAsync(TimeSpan.FromSeconds(1));}catch(TimeoutException){attempts++;如果(尝试>=30)抛出;继续;}休息;}logger.Info("收到消息");//.......}catch(TimeoutException){//dosomething}}这看起来像是TDF中的竞争条件,但我无法弄清楚为什么当我以类似方式使用BufferBlock时BufferBlock起作用发生在其他任何地方。实验性地从ReceiveAsync更改为Receive没有帮助。我没有检查过,但我想确定上面的代码是否完美运行。这是我在“TPL数据流简介”tpldataflow.docx中记录的架构。我应该怎么做才能找到底线?是否有任何指标可以帮助推断正在发生的事情?如果我不能创建可靠的测试用例,我还能提供什么信息?帮助!斯蒂芬似乎认为以下是解决方案varm=awaitmessageQueue.ReceiveAsync();相反:varm=awaitmessageQueue.ReceiveAsync(TimeSpan.FromSeconds(30));你能证实还是否认?以上就是C#学习教程的全部内容:ApparentBufferBlock.Post/Receive/ReceiveAsyncrace/error分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
