我正在开发一个运行在ASP上的大型整体式web应用程序.NET框架,并添加了一个功能.为了并行运行多个任务,我构建了一些抽象.
public interface IImporter
{
Action[] GetProcessActions();
}
public class ImportTaskFactory : IDisposable
{
private readonly Task[] _tasks;
/// <summary>
/// Immediately starts all the Process tasks
/// </summary>
public ImportTaskFactory(CancellationToken cancellationToken, Action<Task> onTaskFaultedAction, IEnumerable<IImporter> importers)
{
_tasks = importers
.SelectMany(importer =>
importer
.GetProcessActions()
.Select(action =>
Task.Factory.StartNew(action, cancellationToken)
.ContinueWith(onTaskFaultedAction, TaskContinuationOptions.OnlyOnFaulted)))
.ToArray();
}
public void WaitAll(CancellationToken cancellationToken)
{
Task.WaitAll(_tasks, cancellationToken);
}
public void Dispose()
{
foreach (var task in _tasks)
{
task?.Dispose();
}
}
}
这叫做
//...
var importers = new IImporter[]
{
//...three classes deriving from IImporter
}
using (var importTasks =
new ImportTaskFactory(_cancellationTokenSource.Token, OnTaskFaulted, importers))
{
importTasks.WaitAll(_cancellationTokenSource.Token);
}
//... where:
private void OnTaskFaulted(Task task)
{
Log.Logline(task.Exception.ToString());
_cancellationTokenSource.Cancel();
}
//...
然而,当运行这些任务时,它们一开始表现良好并完成了它们的工作,但似乎因为不清楚的原因而停止,每个任务都会抛出System.Threading.Tasks.TaskCanceledException
分(内部没有例外).
我已经试着调试了几个小时,但不知道发生了什么.这些任务怎么会被取消呢?我如何调试这个?我是说,我怎么知道是什么触发了取消?
我在OnTaskFaulted
方法中设置了断点,但它似乎从未被调用...这是唯一一个叫_cancellationTokenSource.Cancel();
的地方.