Ho un po 'di codice Sto downgrade da .NET 4.5 bella async
e await
parole chiave a. NET 4.0. Sto usando ContinueWith
per creare una continuazione simile al modo in cui funziona await
.Come prendere un OperationCanceledException quando si utilizza ContinueWith
In sostanza, il mio vecchio codice era:
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.
}
(Come ci si potrebbe aspettare, MyStaticClass.DoStuff(token)
chiama regolarmente token.ThrowIfCancellationRequested()
.)
mio nuovo codice simile a questo:
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.
}
Tuttavia, lo OperationCanceledException
non viene mai catturato. Cosa sta succedendo? Dove metto il mio blocco try/catch?
noti che è possibile utilizzare aspettano con .NET 4.0 utilizzando https://www.nuget.org/packages/Microsoft.Bcl.Async/ –