Ich habe etwas Code, den ich von .NET 4.5 der schönen async
und await
Schlüsselwörter auf .NET 4.0 herabstufen. Ich benutze ContinueWith
, um eine Fortsetzung ähnlich der Art und Weise await
funktioniert zu erstellen.So fangen Sie eine OperationCanceledException bei der Verwendung von ContinueWith
Grundsätzlich meine alten Code war:
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.
}
(Wie man erwarten könnte, MyStaticClass.DoStuff(token)
token.ThrowIfCancellationRequested()
regelmäßig aufruft.)
Mein neuer Code wie folgt aussieht:
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.
}
jedoch Die OperationCanceledException
wird nie gefangen. Was ist los? Wo setze ich meinen Try/Catch-Block?
Beachten Sie, dass Sie warten mit .NET 4.0 verwenden, können mit https://www.nuget.org/packages/Microsoft.Bcl.Async/ –