t.AsyncState); 8 method.BeginInvoke(name

时间:2022-01-19 08:51:37

C#5.0版本颁布有一个"主题那就是异步编程。

我们先创建一个windowForm窗体,实现下面效果,

t.AsyncState); 8 method.BeginInvoke(name

然后我们通过简单的案例比拟同步和异步;

首先我们编写一个耗时要领:

1 /// <summary> 2 /// 耗时要领 3 /// </summary> 4 /// <param></param> 5 private void DoSomething(string name) 6 { 7 Stopwatch watch = new Stopwatch(); 8 watch.Start(); 9 Console.WriteLine("这里是name={0},当前线程ID={1}",name,Thread.CurrentThread.ManagedThreadId); 10 long IResult = 0; 11 for(int i=0;i<100000000;i++) 12 { 13 IResult += 1; 14 } 15 Thread.Sleep(1000); 16 watch.Stop(); 17 Console.WriteLine("这里是name ={0},当前线程ID ={1},计算功效是{2},耗时{3}",name,Thread.CurrentThread.ManagedThreadId,IResult,watch.ElapsedMilliseconds); 18 }

这个耗时要领就是为了执行耗费的时间可明显感知,

然后我们写一个同步要领,执行这个DoSomething()

1 private void btnTongbu_Click(object sender, EventArgs e) 2 { 3 Console.WriteLine("*********************同步执行************************"); 4 for(int i=0;i<5;i++) 5 { 6 string name = string.Format("同步_Click_{0}",i); 7 DoSomething(name); 8 } 9 Console.WriteLine("*********************同步结束************************"); 10 Console.WriteLine("\n\n"); 11 }

打印出来计算功效

t.AsyncState); 8 method.BeginInvoke(name

我们可以从当前的线程ID看出他只有一个线程,并且是挨次执行

我们在写一个异步挪用

1 private void btnAsync_Click(object sender, EventArgs e) 2 { 3 Console.WriteLine("*********************异步执行************************"); 4 for (int i = 0; i < 5; i++) 5 { 6 string name = string.Format("同步_Click_{0}", i); 7 DoSomethingHandler method = DoSomething; 8 method.BeginInvoke(name, null, null); 9 } 10 Console.WriteLine("*********************异步结束************************"); 11 Console.WriteLine("\n\n"); 12 }

执行之后我们比拟一下执行功效:

t.AsyncState); 8 method.BeginInvoke(name

比拟之后发明了什么?

首先他的执行和结束气势派头符在一块了,这是怎么回事呢,这个是因为异步执行的时候线程差别,执行的挨次产生了转变。他的name序号是无序的,线程id也不不异。我们在来看看同样执行的cpu占用率

t.AsyncState); 8 method.BeginInvoke(name

这个是同步的CPU占用截图,会发明有小峰值,但是根基平稳。

t.AsyncState); 8 method.BeginInvoke(name

这个是异步的CPU占用的截图,呈现了明显峰值。

BeginInvoke 要领用于启动异步挪用。它与您需要异步执行的要领具有不异的参数,只不过还有两个特别的参数

本来我们是这样使用的 method.BeginInvoke(name, null, null);

我们来看看他的其他两个参数