我对通过 Post() 或 SendAsync() 发送项目之间的区别感到困惑。我的理解是,在所有情况下,一旦一个项目到达数据块的输入缓冲区,控制权就会返回到调用上下文,对吗?那么为什么我需要 SendAsync 呢?如果我的假设不正确,那么我想知道,相反,如果使用数据块的整个想法是建立并发和异步环境,为什么有人会使用 Post() 。
我当然理解技术上的区别,Post() 返回一个 bool,而 SendAsync 返回一个 bool 的可等待任务。但这有什么影响呢? bool 的返回(我理解是确认该项目是否被放置在数据块的队列中)何时会被延迟?我理解 async/await 并发框架的一般思想,但在这里它没有多大意义,因为除了 bool 之外,对传入项目所做的任何操作的结果都不会返回给调用者,而是放置在一个“出队列”并转发到链接的数据块或丢弃。
这两种方法在发送物品时有性能差异吗?
要查看差异,您需要一种块将推迟其消息的情况。在这种情况下,Post
将返回false
立即,而SendAsync
将返回一个Task
当块决定如何处理消息时,该过程将完成。这Task
将有一个true
如果消息被接受,则结果,并且false
如果没有的话结果。
延迟情况的一个例子是非贪婪连接。一个更简单的例子是当你设置BoundedCapacity
:
[TestMethod]
public void Post_WhenNotFull_ReturnsTrue()
{
var block = new BufferBlock<int>(new DataflowBlockOptions {BoundedCapacity = 1});
var result = block.Post(13);
Assert.IsTrue(result);
}
[TestMethod]
public void Post_WhenFull_ReturnsFalse()
{
var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
block.Post(13);
var result = block.Post(13);
Assert.IsFalse(result);
}
[TestMethod]
public void SendAsync_WhenNotFull_ReturnsCompleteTask()
{
// This is an implementation detail; technically, SendAsync could return a task that would complete "quickly" instead of already being completed.
var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
var result = block.SendAsync(13);
Assert.IsTrue(result.IsCompleted);
}
[TestMethod]
public void SendAsync_WhenFull_ReturnsIncompleteTask()
{
var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
block.Post(13);
var result = block.SendAsync(13);
Assert.IsFalse(result.IsCompleted);
}
[TestMethod]
public async Task SendAsync_BecomesNotFull_CompletesTaskWithTrueResult()
{
var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
block.Post(13);
var task = block.SendAsync(13);
block.Receive();
var result = await task;
Assert.IsTrue(result);
}
[TestMethod]
public async Task SendAsync_BecomesDecliningPermanently_CompletesTaskWithFalseResult()
{
var block = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 });
block.Post(13);
var task = block.SendAsync(13);
block.Complete();
var result = await task;
Assert.IsFalse(result);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)