同步和异步
1.同步是指只启动一个线程
2.异步是指同时启动多个线程
3.同步方法会卡界面,异步方法不会卡界面
原因:异步方法启动了子线程执行任务,主线程得到释放
4.同步方法会慢。异步方法会快
原因:异步启动了.多个线程执行任务,占用了更多的资源
5 异步是无序的,原因:线程的启动和执行是由操作系统决定的,是无序的。

 public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private delegate void DoSomethingHandler(string name); private void Async_Click(object sender, RoutedEventArgs e)
{
DoSomethingHandler method = t =>
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}",
t,Thread.CurrentThread.ManagedThreadId);
method("直接调用");
method.Invoke("Invoke");
method.BeginInvoke("BeginInvoke", null, null);//这就是异步调用
} }
 private void DoSomething(string name)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}",
name, Thread.CurrentThread.ManagedThreadId);
long lResult = 0;
for (int i=0;i<10000000;i++)
{
lResult += i;
}
Thread.Sleep(1000);
watch.Stop();
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1},计算结果是{2},耗时{3}",
name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;
using System.Diagnostics; namespace MyAsyncDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private delegate void DoSomethingHandler(string name);
private void Async_Click(object sender, RoutedEventArgs e)
{
//DoSomethingHandler method = t =>
// Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}", t,Thread.CurrentThread.ManagedThreadId);
//method("直接调用");
//method.Invoke("Invoke");
//for (int i = 0; i < 5; i++)
//{
Console.WriteLine("**********************这里是Async_Click***************");
string name = string.Format("Async_Click_{0}", 1);
// DoSomethingHandler method = DoSomething;
Func<string,long> method = GetSomething;
AsyncCallback callback = t => Console.WriteLine("这里是AsyncCallback,当前线程ID={0},AsyncState={1}", Thread.CurrentThread.ManagedThreadId, t.AsyncState);
IAsyncResult result = method.BeginInvoke(name, callback, "Eleven");//这就是异步调用
//1. 一直等到结束,和同步的效果一样
//result.AsyncWaitHandle.WaitOne(-1); //2.等待异步线程结束的第二种方式
//while (!result.IsCompleted)
//{
// Thread.Sleep(100);
// Console.WriteLine("异步还没有结束,请继续等待");
//}
           /3.常用的第三种方式
long lResult = method.EndInvoke(result);
Console.WriteLine("结果是{0}", lResult);
// }
Console.WriteLine("**********************这里是Async_Click***************"); }
private long GetSomething(string name)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("这里是GetSomething,name={0},当前线程ID={1}",
name, Thread.CurrentThread.ManagedThreadId);
long lResult = 0;
for (int i = 0; i < 10000000; i++)
{
lResult += i;
}
Thread.Sleep(1000);
watch.Stop();
Console.WriteLine("这里是GetSomething,name={0},当前线程ID={1},计算结果是{2},耗时{3}",
name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds);
return lResult;
}
private void DoSomething(string name)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1}",
name, Thread.CurrentThread.ManagedThreadId);
long lResult = 0;
for (int i=0;i<10000000;i++)
{
lResult += i;
}
Thread.Sleep(1000);
watch.Stop();
Console.WriteLine("这里是Async_Click,name={0},当前线程ID={1},计算结果是{2},耗时{3}",
name, Thread.CurrentThread.ManagedThreadId, lResult, watch.ElapsedMilliseconds);
} private void Sync_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 5;i++ )
{
string name = string.Format("Sync_Click_{0}", i);
DoSomething(name);
}
} }
}

  

最新文章

  1. Android 手机卫士8--删除通话记录
  2. Oracle分页函数(存储过程)
  3. 如何使用Chrome Timeline 工具(译)
  4. WEB文件上传漏洞介绍解决办法
  5. DevExpress中设置PanelControl背景的方法
  6. 与PostgreSQL相关的工具
  7. 修改VMware Workstation 界面语言
  8. git 几款好用的客户端工具
  9. TQ210裸机编程(2)——LED流水灯
  10. Linaro系统获取root权限方法
  11. Base64编码转换原理
  12. PAT B1013
  13. hdu 2899
  14. HSmartWindowControl 之 显示图像
  15. 动态规划法(三)子集和问题(Subset sum problem)
  16. redux与react-redux
  17. composer修改中文镜像
  18. 用eclipse 玩转cocos 2dx开发
  19. django1.8中如何显示图片,应用css样式,javascript事件
  20. monad重新理解

热门文章

  1. shell脚本命令(sotr/unip/tr/cut/eval)与正则表达式
  2. IDEA的使用和快捷键
  3. 7、Linux基础--权限、查看用户信息
  4. Git简单介绍以及使用入门
  5. 『无为则无心』Python面向对象 — 46、类和对象
  6. 图解python | 基础数据类型
  7. pytest(13)-多线程、多进程执行用例
  8. nacos配置中心文件(bootstrap.properties)不生效问题解决
  9. 解决方案:ipv4地址手动设置之后关掉推出再打开就没了(静态Ip设置好之后又自动变动态IP)
  10. 移动BI,移动报表平台