繁体   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