Task.FromCanceled 它因指定的取消标记进行的取消操作而完成。
而且建议是和await一起用,我没弄懂它的作用是什么,用法是什么?
static void Main(string[] args) {
DoSth();
Console.WriteLine($"主线程开始沉睡");
Thread.Sleep(2000);
Console.WriteLine($"主线程沉睡结束,顺便结束task");
cancellationTokenSource.Cancel();
Console.ReadKey();
}
static CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
static async void DoSth() {
Task task = Task.Run(() => {
Console.WriteLine($"Task任务开始沉睡");
Thread.Sleep(3000);
Console.WriteLine($"Task任务沉睡结束,执行完成");
}, cancellationTokenSource.Token);
await Task.FromCanceled(cancellationTokenSource.Token);
Console.WriteLine($"DoSth 任务完成");
}
我尝试这样使用 但是报错了
我刚开始以为是持有取消标记的任务被取消就会使await Task.FromCanceled(cancellationTokenSource.Token);的等待结束 而执行后续方法,可是按照我的测试报错了,我现在有点不懂这个方法的用途是什么?
希望 有老哥给详细说下
请加上一句话
try
{
await Task.FromCanceled(cancellationTokenSource.Token);
}
catch
{
}
你就知道问题了,因为他已经挂了。
原因:其实你上一个提问我已经告诉你答案了,而你认为他们告诉你才是真理。
Task.FromResult
Task.CompletedTask
Task.FromException
其实这几个都是一个意思,就是从池里产生一个具备对应状态的Task出来,他不代表task执行,而是代表执行结果
而Task.FromCanceled的正确执行语句为
if(token.IsCancellationRequested)
Task.FromCanceled(token) //取消了情况他会正常执行,没有取消的情况他直接异常
如果令牌取消了,那么产生一个已经取消的task,至于这个task有啥用,你的例子没有用,因为这些东西都是用来 产生结果用来回调通知给外面的
比如
Task xxxx(token)
{
f(token.IsCancellationRequested)
return Task.FromCanceled(token) //这是用来产生一个状态为取消状态的task,同是retrun给上层,告诉上层他取消了
}