Tôi có một số mã tôi hạ cấp từ .NET 4.5's đáng yêu async
và await
từ khóa để .NET 4.0. Tôi đang sử dụng ContinueWith
để tạo sự tiếp tục tương tự như cách hoạt động của await
.Làm thế nào để nắm bắt một OperationCanceledException khi sử dụng ContinueWith
Về cơ bản, mã cũ của tôi là:
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.
}
(Như người ta có thể mong đợi, MyStaticClass.DoStuff(token)
thường xuyên gọi token.ThrowIfCancellationRequested()
.)
mã mới của tôi trông như thế này:
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.
}
Tuy nhiên, OperationCanceledException
không bao giờ bị bắt. Chuyện gì vậy? Tôi đặt khối try/catch ở đâu?
Lưu ý rằng bạn có thể sử dụng chờ đợi với .NET 4.0 sử dụng https://www.nuget.org/packages/Microsoft.Bcl.Async/ –