下面是一些在 LinqPad 中“按原样”运行的代码。它表明我对await
正在做的事情的误解。进一步查看结果和我的问题。
void Main()
{
var cts = new CancellationTokenSource();
StartIt(cts.Token);
Thread.Sleep(500);
"Cancelling".Dump();
cts.Cancel();
}
// Define other methods and classes here
async Task StartIt(CancellationToken token)
{
"StartIt".Dump();
var o = new TestClass();
await o.Step0(token);
}
public class TestClass
{
public async Task Step0(CancellationToken token)
{
var t = Step1(token);
("Step0.Task.Id => " + t.Id).Dump();
await t;
("Step0.IsCancelled? " + t.IsCanceled).Dump();
}
public async Task Step1(CancellationToken token)
{
var t = Step2(token);
("Step1.Task.Id => " + t.Id).Dump();
try {
await t;
}
catch (OperationCanceledException)
{
"Step1.OperationCanceledException".Dump();
}
("Step1.IsCancelled? " + t.IsCanceled).Dump();
}
public Task Step2(CancellationToken token)
{
return Task.Run(() =>{
Thread.Sleep(3000);
token.ThrowIfCancellationRequested();
"Done".Dump();
}, token);
}
}
所以上面产生:
StartIt
Step1.Task.Id => 17
Step0.Task.Id => 18
Cancelling
Step1.OperationCanceledException
Step1.IsCancelled? True
Step0.IsCancelled? False
我的问题:
我希望 Step0 和 Step1 的 task.Id 相同。(因此)我希望发生的取消能够传播方法,以便我可以询问t.IsCanceled
并采取适当的措施。
但我得到了一个不同Task
的返回Step0
。我错过了什么?
谢谢