C# 为什么Task.Run()方法存在第二个`CancelationToken`类型的参数?
我试图理解重载方法的必要性 如果C# 为什么Task.Run()方法存在第二个`CancelationToken`类型的参数?,c#,.net,scheduled-tasks,C#,.net,Scheduled Tasks,我试图理解重载方法的必要性 如果Task.Run()方法的第一个参数中指定的函数没有传递第二个参数,为什么会存在第二个参数CancelationToken类型?在这里,我不得不在sum函数代码中对此使用闭包。另外,我在微软的代码示例中也看到了同样的情况(请查看上面的链接) 这是我的代码: using System; using System.Threading; using System.Threading.Tasks; namespace ThreadsLearning { clas
Task.Run()
方法的第一个参数中指定的函数没有传递第二个参数,为什么会存在第二个参数CancelationToken
类型?在这里,我不得不在sum
函数代码中对此使用闭包。另外,我在微软的代码示例中也看到了同样的情况(请查看上面的链接)
这是我的代码:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ThreadsLearning {
class Program {
private static void Main(string[] args) {
CancellationTokenSource tokenSrc = new CancellationTokenSource();
Func<int, int> sum = n => {
int result = 0;
for (var i = 0; i <= n; i++) {
result += i;
tokenSrc.Token.ThrowIfCancellationRequested();
Console.WriteLine(result);
Thread.Sleep(200);
}
return result;
};
/* Why does exist a second parameter of CancelationToken type, if it
* is even not passed into the function specified in the first parameter
* of Task.Run() method?
* I'm forced to use a closure for this in the 'sum' function code.
*/
var task = Task.Run(() => sum(30), tokenSrc.Token);
// I will get the seame result for CancellationToken.None:
// var task = Task.Run(() => sum(30), CancellationToken.None);
tokenSrc.CancelAfter(TimeSpan.FromSeconds(2));
try {
Console.WriteLine("Result: {0}", task.Result);
}
catch (AggregateException ex) {
foreach (var item in ex.InnerExceptions) {
Console.WriteLine("Exception: {0}", item.Message);
}
}
catch (Exception ex) {
Console.WriteLine("Other exception (the other 'catch' block): {0}", ex.Message);
}
Console.WriteLine("Hit <Enter> for exit...");
Console.ReadLine();
}
}
}
使用系统;
使用系统线程;
使用System.Threading.Tasks;
命名空间线程学习{
班级计划{
私有静态void Main(字符串[]args){
CancellationTokenSource tokenSrc=新的CancellationTokenSource();
Func sum=n=>{
int结果=0;
对于(var i=0;i而言,有两个原因:
- 如果调用
Task.Run
时已请求取消,则传入CancellationToken
可确保您的代码永远不会运行
- 如果您的代码从传入的同一个
CancellationToken
引发OperationCanceledException
,则该任务将被标记为已取消而不是失败。其他代码可能会检查任务状态并相应更改行为
它有两个原因:
- 如果调用
Task.Run
时已请求取消,则传入CancellationToken
可确保您的代码永远不会运行
- 如果您的代码从传入的同一个
CancellationToken
引发OperationCanceledException
,则该任务将被标记为已取消而不是失败。其他代码可能会检查任务状态并相应更改行为
您链接到的备注的第一句-“如果在任务开始执行之前请求取消,则任务不会执行。相反,它被设置为已取消状态并引发TaskCanceledException异常。”(我的重点)相关:您链接到的备注的第一句-“如果在任务开始执行之前请求取消,则该任务不会执行。相反,它被设置为已取消状态并引发TaskCanceledException异常。”(我的重点)相关:你当然是对的。但我不明白为什么回调函数签名中没有
CancellationToken
。这种情况迫使我对这个实例使用闭包。我认为这不好。@AndreyBushman对。有(同上)您可以使用它来传递任意数据,包括取消令牌的另一个副本。遗憾的是,没有相应的任务。运行重载。当然,您是对的。但我不明白为什么取消令牌在回调函数签名中不存在……这种情况迫使我对是实例。我认为这不好。@AndreyBushman是的。您可以使用(同上)来传递任意数据,包括取消令牌的另一个副本。遗憾的是,没有相应的任务。运行重载。