我有问题。 我尝试运行多个长时间运行的任务。如果一个失败,我想取消所有其他任务并获得失败异常。 下面给出的例子。 我想通过
抛出异常来捕获AggregateException throw new Exception("FailureTask");
但是我没有使用AggregateException来捕捉OperationCanceledException,因为我想取消所有其他任务。
[TestMethod]
public void TestParallelTaskCancelation()
{
var cancellationTokenSource = new CancellationTokenSource();
Task[] tasks =
{
Task.Factory.StartNew(DummyTask, cancellationTokenSource, cancellationTokenSource.Token),
Task.Factory.StartNew(DummyTask, cancellationTokenSource, cancellationTokenSource.Token),
Task.Factory.StartNew(DummyTask, cancellationTokenSource, cancellationTokenSource.Token),
Task.Factory.StartNew(DummyTask, cancellationTokenSource, cancellationTokenSource.Token),
Task.Factory.StartNew(FailureTask, cancellationTokenSource, cancellationTokenSource.Token)
};
try
{
Task.WaitAll(tasks, cancellationTokenSource.Token);
}
catch (OperationCanceledException e)
{
Console.WriteLine(e.GetaAllMessages());
}
catch (AggregateException e)
{
Console.WriteLine(e.GetaAllMessages());
}
}
private void DummyTask(object o)
{
var cancellationToken = (CancellationTokenSource)o;
while (true)
{
Thread.Sleep(10000);
if (cancellationToken.IsCancellationRequested)
{
cancellationToken.Token.ThrowIfCancellationRequested();
}
}
}
private void FailureTask(object o)
{
var cancellationToken = (CancellationTokenSource)o;
var executionTask = Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
throw new Exception("FailureTask");
}, cancellationToken.Token);
executionTask.ContinueWith(t =>
{
cancellationToken.Cancel(false);
throw new Exception(t.Exception.GetaAllMessages());
}, TaskContinuationOptions.OnlyOnFaulted);
if (executionTask.Wait(10 * 1000, cancellationToken.Token)) return;
//timeout !!!
throw new Exception("The limit 'Max Seconds Per Query' has been exceeded!!!");
}`
请帮忙。
答案 0 :(得分:2)
这对我有用
public static async void TestParallelTaskCancelation()
{
var cancellationTokenSource = new CancellationTokenSource();
Task[] tasks =
{
Task.Factory.StartNew(DummyTask, cancellationTokenSource, cancellationTokenSource.Token),
Task.Factory.StartNew(DummyTask, cancellationTokenSource, cancellationTokenSource.Token),
Task.Factory.StartNew(DummyTask, cancellationTokenSource, cancellationTokenSource.Token),
Task.Factory.StartNew(DummyTask, cancellationTokenSource, cancellationTokenSource.Token),
Task.Factory.StartNew(FailureTask, cancellationTokenSource, cancellationTokenSource.Token)
};
try
{
await Task.WhenAll(tasks);
}
catch (OperationCanceledException e)
{
Console.WriteLine(e.ToString());
}
catch (AggregateException e)
{
Console.WriteLine(e.ToString());
}
}
答案 1 :(得分:1)
您应该使用throw AggregateException
构造函数而不仅仅是Exception
:
throw new AggregateException ("FailureTask");