using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ATLearn
{
/// <summary>
/// Guid工厂
/// </summary>
static class GuidFactory
{
//private static ThreadLocal<string> _localGuid = new ThreadLocal<string>();
private static AsyncLocal<string> _localGuid = new AsyncLocal<string>();
public static string CurrentGuid
{
get
{
if (_localGuid.Value == null)
{
_localGuid.Value = Guid.NewGuid().ToString();
}
return _localGuid.Value;
}
}
} class APP
{
private Task<int> awaitFunction(int taskId)
{
return Task.Factory.StartNew((obj) =>
{
int itaskId = (int)obj;
Console.WriteLine(string.Format("taskId: {0} Await! threadId: {1} Guid: {2}", taskId, Thread.CurrentThread.ManagedThreadId, GuidFactory.CurrentGuid));
Thread.Sleep();
return itaskId;
}, (object)taskId);
} private async void asyncFunction(int taskId)
{
Console.WriteLine(string.Format("taskId: {0} Start! threadId: {1} Guid: {2}", taskId, Thread.CurrentThread.ManagedThreadId, GuidFactory.CurrentGuid));
int num = await awaitFunction(taskId);
Console.WriteLine(string.Format("taskId:{0} End! threadId: {1} Guid: {2}", taskId, Thread.CurrentThread.ManagedThreadId, GuidFactory.CurrentGuid));
} public APP()
{
for (int i = ; i <= ; ++i)
{
asyncFunction(i);
} while (true)
{
Thread.Sleep();
}
}
} class Program
{
static void Main(string[] args)
{
APP App = new APP();
}
}
}

可见await会开新线程

async标志的函数为异步函数,异步函数内部,在进行await的时候会等待await后面一个线程运行结束

而第一次await的时候,异步函数就会跳过,执行主线程里异步函数之后的内容了

async与await线程分配研究的更多相关文章

  1. Async 与 Await 关键字研究

    1        Aynsc 和 Await 关键字的研究 在 .NET 4.0 以后,基于 Task 的异步编程模式大行其道,因其大大简化了异步编程所带来的大量代码工作而深受编程人员的欢迎,如果你曾 ...

  2. [Winform]线程间操作无效,从不是创建控件的线程访问它的几个解决方案,async和await?

    目录 概述 取消跨线程检查 使用委托异步调用 sync和await 总结 概述 最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或 ...

  3. 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)

    一. 背景 在刚接触开发的头几年里,说实话,根本不考虑多线程的这个问题,貌似那时候脑子里也有没有多线程的这个概念,所有的业务都是一个线程来处理,不考虑性能问题,当然也没有考虑多线程操作一条记录存在的并 ...

  4. 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程

    反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑)   背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...

  5. 探索c#之Async、Await剖析

    阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. ...

  6. Async和Await异步编程的原理

    1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...

  7. 异步方法的意义何在,Async和await以及Task的爱恨情仇,还有多线程那一家子。

    前两天刚感受了下泛型接口的in和out,昨天就开始感受神奇的异步方法Async/await,当然顺路也看了眼多线程那几个.其实多线程异步相关的类单个用法和理解都不算困难,但是异步方法Async/awa ...

  8. .NET4.5 异步编程 async和await

    msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...

  9. Async 和 Await的性能(.NET4.5新异步编程模型)

    异步编程长时间以来一直都是那些技能高超.喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调. 随着 Microso ...

随机推荐

  1. Leetcode刷题第20天

    一.找树左下角的值 题目:513. Find Bottom Left Tree Value C++ Soution 1: /** * Definition for a binary tree node ...

  2. 基本 TCP 的回射服务器

    实验一 代码:链接[01项目] 1. 先启动服务器,如图: 2. 然后启动客户端,如图: 3. 输出结果: [注意]:在服务器终止时,给父进程发送了一个SIGCHILD信号,这一点本例发生了,但是我们 ...

  3. 删除Apache服务的命令

    转到\Apache24\bin目录下,使用cmd命令sc delete apache2.2

  4. CentOS7安装wps

    https://blog.csdn.net/u010445843/article/details/77828552

  5. Redis监控和告警

    https://blog.csdn.net/isoleo/article/details/52981140

  6. [转] js前端解决跨域问题的8种方案(最新最全)

    1.同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.j ...

  7. 使用Eclipse绑定Tomcat并发布应用

    l 步骤1:获得服务器运行环境配置,Window/Preferences/Server/Runtime Environmen l步骤2:添加服务器 l步骤3:选择服务器在硬盘的地址,然后所有的都是确定 ...

  8. php接收base64图片并保存

    header("Content-Type: text/html; charset=utf-8"); /*print_r($_FILES)*/;//所有传入的图片都在files这个数 ...

  9. Web前端开发:Sublime Text 常用插件

    在安装这些插件之前,确保你已经安装了Package Control.   安装Package Control方法:   通过菜单栏View->Show Console 或者快捷键Ctrl+` 打 ...

  10. 【Android】Android取消EditText自动获取焦点

    解决方法: 在EditText的父级控件中找一个,设置成 android:focusable="true" android:focusableInTouchMode="t ...