我有一个类,每个方法都异步执行,即返回一个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线程,因此我只保留最后一个任务并对其进行延续。
正如我所说,我觉得这段代码很复杂。你有更好的建议吗?
答案 0 :(得分:2)
对我来说,好像你问的是错误的问题。像这样的任务队列是一个不寻常的要求。我们对您尝试解决的实际问题一无所知,因此我们无法提出更好的方法。
ContinueWith
用于动态并行处理,因此完全不适合async
代码。但是,您可以使用ContinueWith
与Unwrap
配对来排序模拟await
的行为(如果忽略await
与当前上下文的交互方式)。
因此,您可以简化任务解决方案队列:
private Task QueueTask(Func<Task> futureTask)
{
_lastTask = _lastTask.ContinueWith(t => futureTask()).Unwrap();
return _lastTask;
}
然而,可能有更好的解决方案。如果队列的目的是提供独占访问权限,SemaphoreSlim
会更自然。如果由于某种原因确实需要队列,请考虑使用Dataflow网格。