继续执行任务(而不是委派)

本文关键字:委派 执行任务 继续 | 更新日期: 2023-09-27 18:21:52

我有一个类,其中每个方法异步执行,即返回一个Task,但其中每个方法都应该等待前一个调用的完成。

继续,对吧?

除了任务延续采用参数中的委托(Action),而不是另一个任务。

我尝试过不同的东西,我能做的最好的事情是以下(对我来说相当复杂)代码:

    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将更自然。如果出于某种原因确实需要队列,请考虑使用Dataflow网格。