Пожалуйста, обратите внимание на следующий тривиальный .NET 4.5 код:Как сохранить состояние задачи при Unwrapping
var tcs = new TaskCompletionSource<object>("Hello");
var t1 = tcs.Task;
var t2 = t1.ContinueWith((t, state) => 0, "Hello");
var t3 = t2.ContinueWith((t, state) => new Task<int>(_ => 0, state), "Hello");
var t4 = t3.Unwrap();
Trace.Assert("Hello".Equals(t1.AsyncState), "t1.AsyncState is broken!");
Trace.Assert("Hello".Equals(t2.AsyncState), "t2.AsyncState is broken!");
Trace.Assert("Hello".Equals(t3.AsyncState), "t3.AsyncState is broken!");
Trace.Assert("Hello".Equals(t4.AsyncState), "t4.AsyncState is broken!");
Последнее утверждение терпит неудачу, который ломает мой код (немного меньше, чем надуманный этот образец).
Мой вопрос заключается в том, как заставить задачу выжить в процессе разворачивания? Есть ли способ вручную развернуть с сохранением состояния?
Я не думаю, что ваш пользовательский Unwrap имеет ту же семантику распространения ошибки. Кроме того, это кажется хорошим решением. – usr
Я был бы рад улучшить его. Какие-либо предложения? – mark