簡體   English   中英

TPL數據流-條件循環

[英]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сkActionBlock邏輯,並具有用於處理消息的輸出塊。

至於循環,您可以使用靜態擴展方法相互鏈接這些塊,因此看起來像

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);

Post方法是同步的,如果目標不接受它們,則丟棄消息,比較即使目標現在無法接受也嘗試傳遞消息的SendAsync方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM