C#同步异步运用方法
*需要引用的名称空间:
using System.Threading;
以下方法谁不都等谁,会发生资源争抢
异步操作(同时运行)
class Program
{
static void Main(string[] args)
{
Student stu1 = new Student(){ ID=1, PenColor = ConsoleColor.Red };
Student stu2 = new Student() { ID = 1, PenColor = ConsoleColor.Blue };
Student stu3 = new Student() { ID = 1, PenColor = ConsoleColor.Yellow };
Action action1 = new Action(stu1.DoHomework);
Action action2 = new Action(stu2.DoHomework);
Action action3 = new Action(stu3.DoHomework);
action1.BeginInvoke(null,null);
action2.BeginInvoke(null, null);
action3.BeginInvoke(null, null);
for (int i = 0; i < 3; i++)
{
Console.BackgroundColor = ConsoleColor.Yellow;
Console.WriteLine(i);
Thread.Sleep(1000);
}
}
}
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("Stusent:{0} doinhomework:{1}", this.ID, i);
Thread.Sleep(1000);
}
}
}
显式异步调用(古老级)
使用:Thread thread1 = new Thread(new ThreadStart(action1))
class Program
{
static void Main(string[] args)
{
Student stu1 = new Student(){ ID=1, PenColor = ConsoleColor.Red };
Student stu2 = new Student() { ID = 1, PenColor = ConsoleColor.Blue };
Student stu3 = new Student() { ID = 1, PenColor = ConsoleColor.Yellow };
Action action1 = new Action(stu1.DoHomework);
Action action2 = new Action(stu2.DoHomework);
Action action3 = new Action(stu3.DoHomework);
Thread thread1 = new Thread(new ThreadStart(action1));
Thread thread2 = new Thread(new ThreadStart(action2));
Thread thread3 = new Thread(new ThreadStart(action3));
thread1.Start();
thread2.Start();
thread3.Start();
for (int i = 0; i < 3; i++)
{
Console.BackgroundColor = ConsoleColor.Yellow;
Console.WriteLine(i);
Thread.Sleep(1000);
}
}
}
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("Stusent:{0} doinhomework:{1}", this.ID, i);
Thread.Sleep(1000);
}
}
}
使用C#自带的Task
需要引用的名称空间:
using System.Threading.Tasks;
使用方法:Task task1 = new Task(new Action(stu1.DoHomework));
class Program
{
static void Main(string[] args)
{
Student stu1 = new Student(){ ID=1, PenColor = ConsoleColor.Red };
Student stu2 = new Student() { ID = 1, PenColor = ConsoleColor.Blue };
Student stu3 = new Student() { ID = 1, PenColor = ConsoleColor.Yellow };
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 < 3; i++)
{
Console.BackgroundColor = ConsoleColor.Yellow;
Console.WriteLine(i);
Thread.Sleep(1000);
}
}
}
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("Stusent:{0} doinhomework:{1}", this.ID, i);
Thread.Sleep(1000);
}
}
}