【发布时间】:2015-05-15 06:50:24
【问题描述】:
我有一些代码要从 .NET 4.5 的可爱 async 和 await 关键字降级到 .NET 4.0。我正在使用ContinueWith 创建一个类似于await 工作方式的延续。
基本上,我的旧代码是:
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.
}
(正如人们所预料的那样,MyStaticClass.DoStuff(token) 经常调用token.ThrowIfCancellationRequested()。)
我的新代码如下所示:
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.
}
但是,OperationCanceledException 永远不会被捕获。这是怎么回事?我应该把 try/catch 块放在哪里?
【问题讨论】:
-
请注意,您可以将 await 与 .NET 4.0 一起使用 nuget.org/packages/Microsoft.Bcl.Async
标签: c# asynchronous .net-4.0 async-await