Mam kod, który obniżam ze słów kluczowych .NET 4.5: async
i await
do .NET 4.0. Używam ContinueWith
, aby utworzyć kontynuację podobną do tej, jak działa await
.Jak złapać wyjątek OperationCanceledException podczas korzystania z funkcji ContinueWith
Zasadniczo mój stary kod:
var tokenSource = newCancellationTokenSource();
var myTask = Task.Run(() =>
{
return MyStaticClass.DoStuff(tokenSource.Token);
}, tokenSource.Token);
try
{
var result = await myTask;
DoStuffWith(result);
}
catch (OperationCanceledException)
{
// Cancel gracefully.
}
(Jak można się spodziewać, MyStaticClass.DoStuff(token)
regularnie wzywa token.ThrowIfCancellationRequested()
.)
Mój nowy kod wygląda następująco:
var tokenSource = new CancellationTokenSource();
try
{
Task.Factory.StartNew(() =>
{
return MyStaticClass.DoStuff(tokenSource.Token);
}, tokenSource.Token)
.ContinueWith(task =>
{
var param = new object[1];
param[0] = task.Result;
// I need to use Invoke here because "DoStuffWith()" does UI stuff.
Invoke(new MyDelegate(DoStuffWith, param));
});
}
catch (OperationCanceledException)
{
// Cancel gracefully.
}
jednak OperationCanceledException
nigdy nie zostanie przechwycony. Co się dzieje? Gdzie mogę umieścić blok try/catch?
Zauważ, że możesz użyć czekają z .NET 4.0 używając https://www.nuget.org/packages/Microsoft.Bcl.Async/ –