簡體   English   中英

有什么方法可以等待ActionBlock中的所有任務完成嗎?

[英]Any way to wait for all tasks to be complete in ActionBlock?

首先,讓我描述一下我正在編寫的程序的流程。

GUI中有一個對象列表,當用戶單擊一個對象列表時,將從磁盤讀取對象數據並進行加載。 這可能需要3-4秒。

假設用戶不耐煩,並且在第一個對象仍在加載時單擊了另一個對象。 該程序將加載第二個對象,同時取消第一個對象的加載。

由於用戶可以在垃圾郵件加載操作無法成功完成之前對其進行垃圾郵件處理,因此我實現了一個動作塊來對所有加載操作進行排隊。

所以我有一個這樣的動作塊:

this.loadObjectActionBlock = new ActionBlock<CaseObject>(
    c => this.LoadCaseData(CaseObject),
    new ExecutionDataflowBlockOptions()
    {
        MaxDegreeOfParallelism = 10,
    });

每次用戶單擊Case對象時,我都會調用:

this.loadObjectActionBlock.Post(CaseObject);

CaseObject將由我這樣定義的函數處理:

private void LoadCaseData(CaseObject caseObject)
    {
        caseObject.LoadCaseData();          
    }

我現在需要做的是,我需要等到所有CaseObjects加載完畢后,才能繼續執行我的代碼。

我試圖通過調用來檢測何時處理所有案件

if (this.loadObjectActionBlock.InputCount == 0)
{
    this.loadObjectActionBlock.Complete();
}

caseObject.LoadCaseData(); 但這會導致奇怪的結果,即加載操作發生得太快並且告訴操作塊不要接受更多輸入。 如果我理解正確, InputCount屬性僅查看隊列中剩余的作業數。

所以我想做的就是等待ActionBlock之類的:

await this.loadObjectActionBlock.Completion;

當隊列中的所有內容均已完全處理時。

我可能未按預期使用ActionBlock,因此,如果對此有任何選擇,請提出我可以閱讀的任何內容。

TLDR:我想同時處理多個任務(由用戶啟動),並等待所有任務完成,然后再執行單個任務。

提前致謝 :)

該程序將加載第二個對象,同時取消第一個對象的加載。

隊列不是解決此問題的適當方法,特別是因為TPL塊只能完成一次。

如果要實現此行為,只需確保已觀察到取消令牌,然后再繼續執行下一個操作:

private static void ProcessCase(CaseObject caseObject, CancellationToken token)
{
  caseObject.LoadCaseData();
  token.ThrowIfCancellationRequested();
  ... // Further processing goes here
}

從UI線程調用為:

static CancellationTokenSource _cts;
private static async Task ProcessCaseAsync(CaseObject caseObject)
{
  if (_cts != null)
    _cts.Cancel();
  _cts = new CancellationTokenSource();
  await Task.Run(() => ProcessCase(caseObject, _cts.Token));
}

暫無
暫無

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

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