[英]using TPL ActionBlock, Can I add a new item after the job completed
我在我的應用程序中使用 TPL ActionBlock
來實現並行性。
我有一個應用程序將根據用戶輸入執行操作。 根據輸入,有時操作需要更多時間,有時不需要。
所以ActionBlock
的真正目的是每當輸入出現時,我想首先在 UI 中顯示它(有一個窗口),然后在后台執行操作。 所以這個想法就像來自用戶的任何東西,在 UI 中顯示並在后台並行執行。
現在,在 UI(窗口)中,我有一個停止按鈕來停止用戶輸入。 每當我單擊此 function 時,用戶將無法再輸入任何內容。 現在我也在調用ActionBlock.Complete
方法來檢查隊列/塊是否完成。
所以我的疑問是,
我將ActionBlock.Complete()
作為基於停止按鈕單擊的單獨方法調用,它將等待作業完成然后做一些工作並關閉 UI。 這真的是一個好主意,還是我必須在構造函數內或定義ActionBlock
的地方調用ActionBlock.Complete()
。
public void CheckJobQ()
{
_jobs.Complete();
_jobs.Completion.Wait();
}
和_jobs
是ActionBlock
:
var executionDataflowBlockOptions = new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 100
};
_jobs = new ActionBlock<Tuple<Action<Element>, Element>>((job) =>
{
job.Item1.Invoke(job.Item2);
}, executionDataflowBlockOptions);
所有數據流塊都是線程安全的,因此調用:
_jobs.Complete();
...從一個ActionBlock
的動作是允許的,完全沒問題。
另一方面,數據流塊不是死鎖安全的。 因此,如果您在處理元素時等待塊的完成:
_jobs.Completion.Wait();
...您可能已經在腳上開槍了。 該動作將永遠不會完成,塊本身也不會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.