async/await 的引用
static async void Start()
{
string s = "ass"; Console.WriteLine(getMemory(s)+"Hello World!" + Thread.CurrentThread.ManagedThreadId); await AsyncMethod();
Console.WriteLine(getMemory(s) + "End World!" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine();
}
static async Task AsyncMethod()
{ await Task.Run(() =>
{
Console.WriteLine("AsyncMethod 执行," + Thread.CurrentThread.ManagedThreadId);
});
}
public static string getMemory(object o) // 获取引用类型的内存地址方法
{
GCHandle h = GCHandle.Alloc(o, GCHandleType.WeakTrackResurrection);
IntPtr addr = GCHandle.ToIntPtr(h);
return "0x" + addr.ToString("X");
}
红色的变量的 地址在await 两边一样吗?
是不一样的!
getMemory 这个方法换个写法就一样了:
public static string getMemory(object o) // 获取引用类型的内存地址方法
{
GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned); IntPtr addr = h.AddrOfPinnedObject(); return "0x" + addr.ToString("X");
}
这个值应该是一个的。至少地址是一个。因为引用类型都是在堆上。堆是进程所有的。
async 和await 是成对出现的。有一个注意的点:async 是方法的修饰符,这个方法的await 之后的是回调。出了这个方法就不是的了。
在Winform 程序的Buttion_Click() 方法中,使用了这种异步语法,是没问题的,
private async void button1_Click(object sender, EventArgs e)
{
textBox1.Text += "zzz " + Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
await Task.Run(() => { Thread.Sleep(2000); });
button1.Text += "2";
MessageBox.Show("))))))))))))))))s"); textBox1.Text += "ttt " + Thread.CurrentThread.ManagedThreadId.ToString()+"\r\n"; }
这个Buttion_Click 上可以写async! Await 后面的代码,是主线程操作了控件,这是编译器知道这个程序,然后进行了相应的处理。
async 这种语法,在Web项目中,会增加吞吐量,不会缩短对单个请求的响应时间。
下面是一个Async 的解析后的治理:
static async Task Main()
{
Console.WriteLine("");
await Task.Run(() => {
Console.WriteLine("");
});
Console.WriteLine("");
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks; public class button1_Click : IAsyncStateMachine
{
public int state1; public AsyncVoidMethodBuilder t__builder; public object sender; public EventArgs e; private TaskAwaiter taskWaiter; private void MoveNext()
{
int num = state1;
try
{
TaskAwaiter awaiter;
if (num != )
{
Console.WriteLine("");
awaiter = Task.Run(delegate
{
Console.WriteLine("");
}).GetAwaiter();
if (!awaiter.IsCompleted)
{
num = (state1 = );
taskWaiter = awaiter;
button1_Click stateMachine = this;
t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine);
return;
}
}
else
{
awaiter = taskWaiter;
taskWaiter = default(TaskAwaiter);
num = (state1 = -);
}
awaiter.GetResult();
Console.WriteLine("");
}
catch (Exception exception)
{
state1 = -;
t__builder.SetException(exception);
return;
}
state1 = -;
t__builder.SetResult();
} void IAsyncStateMachine.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
this.MoveNext();
} private void SetStateMachine(IAsyncStateMachine stateMachine)
{
} void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
{
//ILSpy generated this explicit interface implementation from .override directive in SetStateMachine
this.SetStateMachine(stateMachine);
}
}
async/await 的引用的更多相关文章
- [.NET] 利用 async & await 的异步编程
利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html 目录 异步编程的简介 异 ...
- [.NET] 怎样使用 async & await 一步步将同步代码转换为异步编程
怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html ...
- ASP.NET 中的 Async/Await 简介
本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...
- EntityFramework 如何进行异步化(关键词:async·await·SaveChangesAsync·ToListAsync)
应用程序为什么要异步化?关于这个原因就不多说了,至于现有项目中代码异步化改进,可以参考:实际案例:在现有代码中通过async/await实现并行 这篇博文内容针对的是,EntityFramework ...
- ASP.NET 上的 Async/Await 简介
原文链接 大多数有关 async/await 的在线资源假定您正在开发客户端应用程序,但在服务器上有 async 的位置吗?可以非常肯定地回答“有”.本文是对 ASP.NET 上异步请求的概念性概述, ...
- 进阶篇:以IL为剑,直指async/await
接上篇:30分钟?不需要,轻松读懂IL,这篇主要从IL入手来理解async/await的工作原理. 先简单介绍下async/await,这是.net 4.5引入的语法糖,配合Task使用可以非常优雅的 ...
- 从async await 报错Unexpected identifier 谈谈对上下文的理解
原文首发地址: 先简单介绍下async await: async/await是ES6推出的异步处理方案,目的也很明确:更好的实现异步编程. 详细见阮大神 ES6入门 现在说说实践中遇到的问题:使用 ...
- async/await使用深入详解
async和await作为异步模型代码编写的语法糖已经提供了一段时间不过一直没怎么用,由于最近需要在BeetleX webapi中集成对Task方法的支持,所以对async和await有了深入的了解和 ...
- 异步 async & await
1 什么是异步 异步的另外一种含义是计算机多线程的异步处理.与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程. 2 异步场景 l 不 ...
随机推荐
- es搭建过程会存在的问题 针对6.x
常见的四个基本错误 错误1 can not run elasticsearch as root 解决方案: 因为安全问题elasticsearch 不让用root用户直接运行,所以要创建新用户 第一步 ...
- idhttp访问HTTPS
idhttp访问HTTPS 访问一个 WEB 网站,如果采用 HTTP 的话,直接使用 TIdHTTP 这个控件,最简单的用法是: S := IdHTTP1.Get('www.qq.com'); 这里 ...
- 学PHP应注意的问题与知识点
编出一手好代码,这个是需要你在平时开发中日积月累的,平时如果你有注意到以下的那些代码的编码,那么祝贺你,你在技能提升这方面已经垫下了一些基础,编写出一手好代码,说白了就是你特么注意到性能这块的问题,代 ...
- java客户端验证https连接(忽略证书验证和证书验证两种方式)
首先根据如下操作生成证书,配置springboot https,生成一个简单的https web服务 https://www.cnblogs.com/qq931399960/p/11889349.ht ...
- 无法访问com.alibaba.fastjson.parser.deserializer.PropertyProcessable
某项目加入了某依赖A,IDEA里编译报了如下错误: 无法访问com.alibaba.fastjson.parser.deserializer.PropertyProcessable 错误代码行为某个使 ...
- 在windows平台下搭建Django项目虚拟环境
参考文档:https://www.cnblogs.com/lovele-/p/8719126.html https://blog.csdn.net/lwcaiCSDN/article/details ...
- c# 线程异步处理
public class AsyncHelper { private static readonly TaskFactory _myTaskFactory = new TaskFactory(Canc ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_15-webpack研究-webpack-dev-server-程序调试
webpack把我们的js文件都打包了.所以不能用chrome的调试工具. 打包生成的js文件比较乱无法跟踪. 配置好了以后就可以让浏览器查看到打包后的源代码 在源代码这里加一个debuuger 这里 ...
- [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...
- Spring Cloud(5):服务路由(Zuul)
Zuul简介 所有微服务之间的调用,都应该通过服务网关进行路由,服务网关充当服务与服务之间的中介.服务网关像交通警察一样指挥交通,将用户引导到目标微服务实例.服务网关还充当着应用程序内所有微服务调用的 ...