要看到區別,你需要一個塊將推遲他們的消息的情況。在這種情況下,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);
}
好的,但是給出你的解釋,那麼'Task'背後的邏輯是什麼?如果由於推遲而無法立即提交,但任務稍後完成,那麼bool是真的還是假的區別? –
該塊可能最終決定拒絕該消息(例如,如果您完成了該塊),在這種情況下,該任務的結果將爲「假」。查看更新的答案。 –
太棒了,這現在完全有意義,這種可能性完全滑落了我的想法。非常感謝。 –