[英]TPL Dataflow - Conditional loops
當前,我正在處理管道數據流,其中除階段1外的每個階段都是async
運行的使用者和生產者。 我的對象“流”過我的管道,這些管道參考了項目。 在階段3中,我想創建一個循環並緩沖所有滿足特殊條件的對象(階段循環)。
如果有新對象進入(階段3),而當前還有其他對象正在緩存(階段循環),我想檢查它們是否在它們的引用項中匹配,如果有,則將它們發布到Stage Loop的BufferBlock
中。
問題是,如何從Stage 3中檢查Stage Loop中所有對象的引用項?
管道有點像這樣:
Incoming objects ->
BufferBlock1 -> Parsing (Stage2) ->
BufferBlock2 -> Processing (Stage3) ->
BufferBlock3 -> Stage Loop ->
Back to BufferBlock 2
您確實不需要您的鏈中有那么多BufferBlock
。 TPL數據流包含一個TransformBlock
,它封裝了BufferBloсk
和ActionBlock
邏輯,並具有用於處理消息的輸出塊。
至於循環,您可以使用靜態擴展方法相互鏈接這些塊,因此看起來像
stage2.LinkTo(stage3, CheckForExistingProcessing);
stage2.LinkTo(stage4);
Jere stage4
是未通過檢查且必須循環處理的消息的隊列。 您可以設置其他ActionBlock
,或者也許只是使用TransformBlock
將消息再次發送到適當的階段。 我認為您也可以引入重試檢查,因為有些原因可能根本無法處理某些消息。
此外,如你所說,你有async
邏輯,你應該SendAsync
消息,而不是Post
他們(你也可以使用帶有過載CancellationToken
):
// asynchronously wait for a sending with resending attempts
await stage1.SendAsync(m);
// asynchronously wait for a sending with resending attempts with possible cancellation
await stage2.SendAsync(m, token);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.