1. 隐式异步调用:委托的beginInvoke
namespace MultiThreadExample
{
class Program
{
//隐式异步调用
static void Main(string[] args)
{
Student stu1 = new Student() { ID = 1, PenColor = ConsoleColor.Yellow };
Student stu2 = new Student() { ID = 2, PenColor = ConsoleColor.Green };
Student stu3 = new Student() { ID = 3, PenColor = ConsoleColor.Red };
Action action1 = new Action(stu1.DoHomeWork);
Action action2 = new Action(stu2.DoHomeWork);
Action action3 = new Action(stu3.DoHomeWork);
action1.BeginInvoke(null, null);//BeginInvoke会自动生成一个分支线程,在分支线程里调用方法。
action2.BeginInvoke(null, null);
action3.BeginInvoke(null, null);
//(查看执行的结果就发现并没有按照设定的背景色显示,这是争抢资源造成的,要避免多线程争抢资源,就需要加:锁。)
for (int i = 0; i < 10; i++)
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("main Thread{0}", i);
Thread.Sleep(1000);
}
Console.ReadLine();
}
class Student
{
public int ID { get; set; }
public ConsoleColor PenColor { get; set; }
public void DoHomeWork()
{
for (int i = 0; i < 5; i++)
{
Console.ForegroundColor = this.PenColor;
Console.WriteLine("Student {0} doing homework {1} hour(s);", this.ID, i);
Thread.Sleep(1000);
}
}
}
}
}
2. 显示异步调用的两种方法:Thread + Task
namespace MultiThreadExample2
{
class Program
{
//显示异步调用:1.使用Thread; 2.使用Task
static void Main(string[] args)
{
Student stu1 = new Student() { ID = 1, PenColor = ConsoleColor.Yellow };
Student stu2 = new Student() { ID = 2, PenColor = ConsoleColor.Green };
Student stu3 = new Student() { ID = 3, PenColor = ConsoleColor.Red };
使用Thread
//Thread thread1 = new Thread(new ThreadStart(stu1.DoHomeWork));
//Thread thread2 = new Thread(new ThreadStart(stu2.DoHomeWork));
//Thread thread3 = new Thread(new ThreadStart(stu3.DoHomeWork));
//thread1.Start();
//thread2.Start();
//thread3.Start();
//使用Task:
Task task1 = new Task(new Action(stu1.DoHomeWork));
Task task2 = new Task(new Action(stu2.DoHomeWork));
Task task3 = new Task(new Action(stu3.DoHomeWork));
task1.Start();
task2.Start();
task3.Start();
for (int i = 0; i < 10; i++)
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("main Thread{0}", i);
Thread.Sleep(1000);
}
Console.ReadLine();
}
class Student
{
public int ID { get; set; }
public ConsoleColor PenColor { get; set; }
public void DoHomeWork()
{
for (int i = 0; i < 5; i++)
{
Console.ForegroundColor = this.PenColor;
Console.WriteLine("Student {0} doing homework {1} hour(s);", this.ID, i);
Thread.Sleep(1000);
}
}
}
}
}