2 回答
TA貢獻1830條經驗 獲得超9個贊
這似乎不正確,因為它可能會丟失輸入。
假設您使用默認值,這是正確的。Post僅false當塊拒絕輸入時才返回。如果模塊已接收到Complete信號,或者模塊的輸入緩沖區已滿,則可能會發生這種情況。默認情況下,每個塊的輸入緩沖區可以無限增長,因此ActionBlock具有默認輸入緩沖區大小的塊只會false在調用Post后返回。Complete
最常見的用例ActionBlock是具有無限的有限容量,并且代碼僅Complete在添加所有項目后調用。在這種情況下,Post永遠不會返回false,您可以安全地忽略返回值。
TA貢獻1875條經驗 獲得超3個贊
Post如果塊完成,或者塊的輸入緩沖區已滿,該方法將返回 false。由于該設置并不是什么奇特的東西,并且很可能在項目的后期階段需要解決高 RAM 使用率的新問題,因此我認為使用該方法并簡單地忽略結果BoundedCapacity并不是一個安全的選擇。Post為了避免涉及丟失消息(可能是訂單或發票)的無趣錯誤,您可以執行以下操作:
foreach (var item in items)
{
var accepted = block.Post(item);
if (!accepted) throw new InvalidOperationException("Item was not accepted");
}
這樣,您至少會收到有關某些內容損壞的通知,并且不會讓錯誤行為蔓延。
另一方面,等待SendAsync并忽略結果要安全得多。SendAsync通常會在發生異?;虬l生取消的情況下返回,在這種情況下,您會在塊發生時false收到通知。所以在這種情況下不需要拋出異常。awaitCompletion
foreach (var item in items)
{
await block.SendAsync(item).ConfigureAwait(false);
}
出于性能原因,您可以同時使用Post和SendAsync。僅當您有數千萬個項目需要處理時,這才會產生影響。
foreach (var item in items)
{
if (!block.Post(item))
{
await block.SendAsync(item).ConfigureAwait(false);
}
}
- 2 回答
- 0 關注
- 213 瀏覽
添加回答
舉報
