Я пытаюсь понять поведение задач .net, когда привязаны дети.Детское задание отменено, родитель завершен?
Я следующий код теста:
void Test()
{
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task child = null;
var parent = Task.Factory.StartNew(() =>
{
child = Task.Factory.StartNew(() =>
{
while (!token.IsCancellationRequested)
Thread.Sleep(100);
token.ThrowIfCancellationRequested();
}, token, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);
}, token);
Thread.Sleep(500);
Debug.WriteLine("State of parent before cancel is {0}", parent.Status);
Debug.WriteLine("State of child before cancel is {0}", child.Status);
tokenSource.Cancel();
Thread.Sleep(500);
Debug.WriteLine("State of parent is {0}", parent.Status);
Debug.WriteLine("State of child is {0}", child.Status);
}
Результат этого:
State of parent before cancel is WaitingForChildrenToComplete
State of child before cancel is Running
A first chance exception of type 'System.OperationCanceledException' occurred in mscorlib.dll
State of parent is RanToCompletion
State of child is Canceled
Aparrently государственная задача родителя не Canceled
, даже если обе задачи разделяют одну фишку, и ребенок прилагается.
Как вернуть родительскую задачу в состояние возврата Canceled
при аннулировании?
ПРИМЕЧАНИЕ Если я выдаю исключение, то обе задачи возвращают Faulted
.
Это 'Faulted', это особое состояние здесь, где (по какой-либо причине) состояние childs отражается в родительском. «Отказано» специально [вызывается] (http://blogs.msdn.com/b/pfxteam/archive/2009/08/30/9889070.aspx) как «Чтобы закончить в состоянии« Отменено », задача должна либо иметь аннулирование, запрашиваемое до начала выполнения, или оно должно подтвердить запрос на отмену во время его исполнения ». и ни одно из них не относится к родителям. –
Таким образом, родительская задача должна ждать дочерней задачи и бросать ее собственное 'OperationCanceledException' для ее состояния, которое нужно отменить? – Anders