簡體   English   中英

使用 TPL ActionBlock,我可以在作業完成后添加一個新項目嗎

[英]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();
}

_jobsActionBlock

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.

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