.NET4.0新功能:任务(Task)
用过.NET线程池的程序员都知道通过调用ThreadPool类的QueueUserWorkItem方法把要执行的代码放入线程池去执行。由于.NET FCL的强大,使得这个操作极其简便。但使用线程池有个明显的不足之处,那就是我们无法获取线程池执行方法的返回值,因为WaitCallback委托的返回值为void。注:WaitCallback委托的原型为:public delegate void WaitCallback(Object state)。
比如,我们有个方法代码是这样的:
public int Sum()
{
//此方法模拟一个耗时操作
int sum = 0;
for (int num = 1; num <= 100; num++)
{
Thread.Sleep(5);
sum += num;
}
return sum;
{
//此方法模拟一个耗时操作
int sum = 0;
for (int num = 1; num <= 100; num++)
{
Thread.Sleep(5);
sum += num;
}
return sum;
}
假如这个方法可以加入线程池中去执行(实际上不能,因为不匹配WaitCallback委托),但我们也无法获取执行的结果。随着.NET4.0的发布,这个问题得到了解决,.NET 4.0提供了一个新功能,叫任务(Task),在System.Threading.Task命名空间下,有个Task类及其泛型版本Task<TResult>。我们可以把这个方法添加到任务,并可以获得执行结果,示意代码如下:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace TaskDemo
{
class Program
{
static void Main(string[] args)
{
Task<int> task = new Task<int>(() => Sum());//新建任务实例
task.Start();//开始任务
Console.WriteLine("任务已开始");
task.Wait();//等待任务执行完成
Console.WriteLine(task.Result);
}
//此方法模拟一个耗时操作
static int Sum()
{
Console.WriteLine("任务正在执行");
int sum = 0;
for (int num = 1; num <= 100; num++)
{
Thread.Sleep(5);
sum += num;
}
return sum;
}
}
}
using System.Threading;
using System.Threading.Tasks;
namespace TaskDemo
{
class Program
{
static void Main(string[] args)
{
Task<int> task = new Task<int>(() => Sum());//新建任务实例
task.Start();//开始任务
Console.WriteLine("任务已开始");
task.Wait();//等待任务执行完成
Console.WriteLine(task.Result);
}
//此方法模拟一个耗时操作
static int Sum()
{
Console.WriteLine("任务正在执行");
int sum = 0;
for (int num = 1; num <= 100; num++)
{
Thread.Sleep(5);
sum += num;
}
return sum;
}
}
}
任务(Task)确实是个好东东!这里只对任务(Task)作个初步的介绍。由于我也只是刚接触,感觉这是个非常有用的功能,于是忍不住就写出来了,由于笔者水平有限,不足之处还望高手指点。
最后,非常感谢Jeffrey Richter给我们带来的惊喜--《CLR via C#, Third Edition》。
参考文献:《CLR via C#, Third Edition》,作者:Jeffrey Richter。
分类:
.NET Framework
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库