前言
关于C#多线程的使用,想必网上已经有很多前辈进行过详细的总结。笔者在此再次进行整理,主要目的在于对自己学到的东西做一个总结和记录。本人接触C#的时间尚短,想必在很多地方还有缺陷,还请可能存在的读者们予以谅解并加以指教;如果本文真的能帮助到一些读者的话,那笔者实在是不胜荣幸。
更好的多线程使用方法——Task
上一篇文章中笔者对Thread
和ThreadPool
的基础使用方法进行了整理,并提到了Task
。那么这一篇文章,就来开始介绍Task
。Task
位于System.Threading.Tasks
命名空间中,其简单的使用方法和Thread
有些类似,都可以通过函数(和参数)来创建并开始运行:
static void Func1()
{
int r = 0;
//一个耗时的操作
for (int i = 0; i != int.MaxValue; ++i)
{
++r;
}
Console.Out.WriteLine(r);
}
static void Func2(object obj)
{
Thread.Sleep(1000);
//模拟一个耗时的操作
Console.Out.WriteLine("Func2 is running with {0}", obj as string);
}
static void Main(string[] args)
{
//如果不需要,可以不保留Task对象,
//直接进行执行
new Task(Func1).Start();
//使用了Run方法的版本
//Task.Run(() => Func1());
Task.Run(() => Func2("Task"));
//使用了Start方法的版本
//便于理解如何为Task传递参数
//new Task(Func2, "Task").Start();
Console.In.Read();
}
以上的代码通过Task
创建了两个任务,分别运行Func1
和Func2
。Main
中的第一行代码创建了Task
对象并立刻调用了Start
,实际使用中也可以先创建完Task
对象后再调用Start
。但是按照《CLR via C#》一书中的说法,创建Task
对象并立即调用Start
是常见的编程模式,因此Task
类中也提供了静态方法Run
用于创建并调用任务。Main
中的第二行代码便是使用了Run
方法,其参数是一个lambda表达式,并在lambda表达式生成的匿名函数中调用了