簡體   English   中英

繼續執行任務(而不是代表)

[英]Continuation with Tasks (instead of delegates)

我有一個類,其中每個方法異步執行,即返回一個Task,但是每個方法仍應等待上一個調用的完成。

繼續吧?

除了任務繼續采用參數中的委托(動作),而不是其他任務。

我嘗試了不同的方法,而使它能夠正常工作的最佳方法是以下(對我而言相當復雜)的代碼:

    private Task QueueTask(Func<Task> futureTask)
    {
        var completionSource = new TaskCompletionSource<int>();

        _lastTask.ContinueWith(async t =>
        {
            try
            {
                await futureTask();

                completionSource.SetResult(0);
            }
            catch (Exception ex)
            {
                completionSource.SetException(ex);
            }
        });

        _lastTask = completionSource.Task;

        return _lastTask;
    }

_lastTask是我班的私人成員。 由於所有調用都來自UI線程,因此我只保留最后一個任務並繼續執行。

正如我所說,我發現這段代碼非常復雜。 您有更好的建議嗎?

對我來說,似乎您在問錯問題。 這樣的任務隊列是一個不尋常的要求。 我們對您要解決的實際問題一無所知,因此我們無法提出更好的方法。

ContinueWith用於動態並行處理,因此它不太適合async代碼。 但是,您可以將ContinueWithUnwrap配對使用,以對await的行為進行排序(如果忽略了await與當前上下文的交互方式)。

因此,您可以像這樣簡化任務隊列解決方案:

private Task QueueTask(Func<Task> futureTask)
{
    _lastTask = _lastTask.ContinueWith(t => futureTask()).Unwrap();
    return _lastTask;
}

但是,可能有更好的解決方案。 如果隊列的目的是提供獨占訪問,則SemaphoreSlim會更自然。 如果實際上由於某種原因確實需要隊列,請考慮使用數據流網格。

暫無
暫無

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

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