2 回答

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個贊
這似乎不正確,因?yàn)樗赡軙G失輸入。
假設(shè)您使用默認(rèn)值,這是正確的。Post
僅false
當(dāng)塊拒絕輸入時才返回。如果模塊已接收到Complete
信號,或者模塊的輸入緩沖區(qū)已滿,則可能會發(fā)生這種情況。默認(rèn)情況下,每個塊的輸入緩沖區(qū)可以無限增長,因此ActionBlock
具有默認(rèn)輸入緩沖區(qū)大小的塊只會false
在調(diào)用Post
后返回。Complete
最常見的用例ActionBlock
是具有無限的有限容量,并且代碼僅Complete
在添加所有項(xiàng)目后調(diào)用。在這種情況下,Post
永遠(yuǎn)不會返回false
,您可以安全地忽略返回值。

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個贊
Post如果塊完成,或者塊的輸入緩沖區(qū)已滿,該方法將返回 false。由于該設(shè)置并不是什么奇特的東西,并且很可能在項(xiàng)目的后期階段需要解決高 RAM 使用率的新問題,因此我認(rèn)為使用該方法并簡單地忽略結(jié)果BoundedCapacity并不是一個安全的選擇。Post為了避免涉及丟失消息(可能是訂單或發(fā)票)的無趣錯誤,您可以執(zhí)行以下操作:
foreach (var item in items)
{
var accepted = block.Post(item);
if (!accepted) throw new InvalidOperationException("Item was not accepted");
}
這樣,您至少會收到有關(guān)某些內(nèi)容損壞的通知,并且不會讓錯誤行為蔓延。
另一方面,等待SendAsync并忽略結(jié)果要安全得多。SendAsync通常會在發(fā)生異?;虬l(fā)生取消的情況下返回,在這種情況下,您會在塊發(fā)生時false收到通知。所以在這種情況下不需要拋出異常。awaitCompletion
foreach (var item in items)
{
await block.SendAsync(item).ConfigureAwait(false);
}
出于性能原因,您可以同時使用Post和SendAsync。僅當(dāng)您有數(shù)千萬個項(xiàng)目需要處理時,這才會產(chǎn)生影響。
foreach (var item in items)
{
if (!block.Post(item))
{
await block.SendAsync(item).ConfigureAwait(false);
}
}
- 2 回答
- 0 關(guān)注
- 190 瀏覽
添加回答
舉報(bào)