【发布时间】:2014-03-09 05:01:58
【问题描述】:
根据svick 的建议,我创建了一个小类,其目的是按顺序运行任务,也就是说,它将它们安排在 ThreadPool 上,但它确保它们按照提交的顺序一个接一个地执行。它看起来像这样:
class SequentialTaskRunner<TResult> where TResult : new() {
public Task<TResult> Run(Func<TResult> func) {
var result = RunInternal(func, m_previous);
m_previous = result;
return result;
}
async Task<TResult> RunInternal(Func<TResult> func, Task<TResult> previous) {
await previous;
return await Task.Run(func);
}
Task<TResult> m_previous = Task.FromResult(new TResult());
}
现在,我遇到的问题是,如果 func() 抛出异常,那么随后每次调用 Run() 也会返回该异常,并且无法运行新任务。我试图改变 RunInternal 像这样:
async Task<TResult> RunInternal(Func<TResult> func, Task<TResult> previous) {
if (previous.Exception == null) {
await previous;
}
return await Task.Run(func);
}
但这并不可靠;如果任务提交很快,一个失败仍然会导致多个返回相同的异常。我对为什么感到困惑,并希望得到解释。我刚刚开始使用 async/await btw。
【问题讨论】:
标签: c# async-await