C#中的异步学习
2021-04-29 20:27
标签:nbsp cal ted i++ 操作 编程 handler event 不同 C#中的异步 C#5.0版本发布有一个"主题那就是异步编程。 我们先创建一个windowForm窗体,实现下面效果,然后我们通过简单的案例对比同步和异步; 首先我们编写一个耗时方法: 这个耗时方法就是为了执行耗费的时间可明显感知, 然后我们写一个同步方法,执行这个DoSomething() 打印出来计算结果 我们可以从当前的线程ID看出他只有一个线程,并且是顺序执行 我们在写一个异步调用 执行之后我们对比一下执行结果: 对比之后发现了什么? 首先他的执行和结束风格符在一块了,这是怎么回事呢,这个是因为异步执行的时候线程不同,执行的顺序发生了改变。他的name序号是无序的,线程id也不相同。我们在来看看同样执行的cpu占用率 这个是同步的CPU占用截图,会发现有小峰值,但是基本平稳。这个是异步的CPU占用的截图,出现了明显峰值。 BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数 原来我们是这样使用的 method.BeginInvoke(name, null, null); 我们来看看他的其他两个参数 IAsyncResult 接口存储一个异步操作的状态信息,并提供一个同步对象,以使线程能够在操作完成时发出信号。 AsyncCallback委托表示异步操作完成时调用的回调方法
我们在来看看异步等待 reuslt.AsyncWaitHandle.WaitOne(-1);//一直等待到结束 他是等待一个线程结束后在执行下一线程
while(!reuslt.IsCompleted) method.EndInvoke(reuslt); 这是三种异步等待的的方法和结果。我们来总结一下啊 /* C#中的异步学习 标签:nbsp cal ted i++ 操作 编程 handler event 不同 原文地址:http://www.cnblogs.com/widows/p/7816257.html 1 ///
1 private void btnTongbu_Click(object sender, EventArgs e)
2 {
3 Console.WriteLine("*********************同步执行************************");
4 for(int i=0;i5;i++)
5 {
6 string name = string.Format("同步_Click_{0}",i);
7 DoSomething(name);
8 }
9 Console.WriteLine("*********************同步结束************************");
10 Console.WriteLine("\n\n");
11 }
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 }
1 private void btnAsyncSr_Click(object sender, EventArgs e)
2 {
3 Console.WriteLine("*********************异步深入执行************************");
4 string name = string.Format("同步_Click_{0}", 1);
5 DoSomethingHandler method = DoSomething;
6
7 AsyncCallback callback = t => Console.WriteLine("这里是AsyncCallback,当前线程ID={0},AsyncState={1}",Thread.CurrentThread.ManagedThreadId,t.AsyncState);
8 method.BeginInvoke(name,callback,"设定状态1");
9 //method.BeginInvoke(name, null, null);
10
11 IAsyncResult reuslt=method.BeginInvoke(name,t=> Console.WriteLine("这里是IAsyncResult,当前线程ID={0},AsyncState={1}", Thread.CurrentThread.ManagedThreadId, t.AsyncState),"设定状态2");
12
13
14 Console.WriteLine("*********************异步深入结束************************");
15 Console.WriteLine("\n\n");
16 }
{
Thread.Sleep(100);
Console.WriteLine("请继续等待……");
}
*总结
* 1、同步方法会卡住界面,异步方法不卡界面;原因:异步启动了子线程来执行任务,主线程得到释放
* 2、同步方法会慢,异步方法比同步快;原因:异步启动了多个线程执行任务,占用了更多资源
* 3、异步是无序的;原因:线程的启动和执行是有操作系统决定的,是无序的。
*/
上一篇:weiapi 获取项目根目录