Net中异步
同步和异步
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);
}
} }
}
Net中异步的更多相关文章
- 在内核中异步请求设备固件firmware的测试代码
在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...
- 在 tornado 中异步无阻塞的执行耗时任务
在 tornado 中异步无阻塞的执行耗时任务 在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在 ...
- C#中异步和多线程的区别
C#中异步和多线程的区别是什么呢?异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为异步和多线程是等同的概念.但是,异步和多线程还是有一些区别的.而这些区 ...
- ionic中将service中异步返回的数据赋值给controller的$scope
1.service中异步获取数据实例 angular.module('starter.services', []) .factory('Chats', function($http,$q) {//定义 ...
- nodejs中异步
nodejs中的异步 1 nodejs 中的异步存在吗? 现在有点 javascript 基础的人都在听说过 nodejs ,而只要与 javascript 打交到人都会用或者是将要使用 nodejs ...
- cocos2dx lua中异步加载网络图片,可用于显示微信头像
最近在做一个棋牌项目,脚本语言用的lua,登录需要使用微信登录,用户头像用微信账户的头像,微信接口返回的头像是一个url,那么遇到的一个问题就是如何在lua中异步加载这个头像,先在引擎源码里找了下可能 ...
- echarts异步数据加载(在下拉框选择事件中异步更新数据)
接触echarts 大半年了,从不会到熟练也做过不少的图表,隔了一段时间没使用这玩意,好多东西真心容易忘了.在接触echarts这期间也没有总结什么东西,今天我就来总结一下如何在echart中异步加载 ...
- SpringBoot中异步请求和异步调用(看这一篇就够了)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10661591.html,否则将追究法律责任!!! 一.SpringBoot中异步请求的使用 ...
- Java网络编程中异步编程的理解
目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...
- Flink中异步AsyncIO的实现 (源码分析)
先上张图整体了解Flink中的异步io 阿里贡献给flink的,优点就不说了嘛,官网上都有,就是写库不会柱塞性能更好 然后来看一下, Flink 中异步io主要分为两种 一种是有序Ordered 一种 ...
随机推荐
- Foundation框架介绍
1.Foundation框架介绍 什么是框架? 众多功能\API的集合 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易,在OS X下的Mac操作系统中大约有80 ...
- NSLog 和printf区别
NSLog是Foundation框架供的Objective-C日志输出函数,与标准C中的printf函数类似,并可以格式化输出. NSLog传递进去的格式化字符是NSString的对象,而不是char ...
- 云端iclound使用-陈棚
使用NSmetadataQuery查询文档,增加,删除,编辑 界面设计完成后效果如图: 程序清单:FKDiary.h @interface FKDiary : UIDocument @property ...
- Shell脚本之编程规范和变量
Shell脚本编程规划和变量 1.Shell脚本概述 2.Shell编程规划 3.重定向与管道 4.Shell脚本变量 1.Shell脚本概述 Shell的作用:充当"翻译官"的角 ...
- Docker consul的容器服务更新与发现
Docker consul的容器服务更新与发现 目录 Docker consul的容器服务更新与发现 一.Consul简介 1. 服务注册与发现 2. consul概述 3. consul的两种模式 ...
- Spark算子 - aggregateByKey
释义 aggregateByKey逻辑类似 aggregate,但 aggregateByKey针对的是PairRDD,即键值对 RDD,所以返回结果也是 PairRDD,结果形式为:(各个Key, ...
- Oracle 获取表注释和列注释
全部表 select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 selec ...
- 卡特兰数是我见过第二神奇的东西//下一个是stirling数列
自从上次斐波那契的总结后,今天有一次遇上了正宗卡特兰数. 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, ...
- sql与数据库
sql的优化: 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建索引 2.尽量避免在WHERE字句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描 3. ...
- CentOS 7 编译部署LAMP环境
文章目录 1.需求以及环境准备 1.1.版本需求 1.2.环境准备 1.3.安装包准备 2.编译升级Openssl 2.1.查看当前Openssl版本 2.2.备份当前版本Openssl文件 2.3. ...