1、线程安全

在使用TaskRun的时候需要注意线程安全的问题。

线程安全通常是由全局变量及静态变量引起的,如果是值类型就不存在这样的隐患,如果是引用类型用不好就会导致线程不安全!

2、Task、Task<T>存在的意义

这问题困扰了我很久,包括到现在还是有问题没想明白。

Task可以等同于void的线程,那么Task能节约时间是能理解的。

Task<T>能省时间吗?答案是能,Debug的时候我曾陷入一个误区,误认为Task<T>的方法是串行的,其实是并行的,比如有3个异步方法,方法1耗时3秒,方法2耗时6秒,方法3耗时4秒,串行肯定是13秒,但在Task<T>下3个方法是并行的,总耗时约等于最长耗时的方法2也就是6秒。脑部一下3个方法在同时执行,方法1先结束并返回值、方法3接着结束并返回值,方法2最后结束并返回返回值。如果在总方法里面还有一个var m=a+b+c,则m可理解为3个方法都结束后再来调用。

OK,上面举得例子是3个无关的方法,加入方法2的参数是方法1的返回值,又是什么情况呢?实践证明,framework已经把它处理成了方法2必须等待方法1全部执行完才执行,也就是总耗时为3+6=9秒,方法三的时间在并行时自动节约掉了!!

using System;
using System.Threading;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DateTime dtBegin = DateTime.Now;
var delayTask = DisplayValue(); DisplayValue3();
int x = delayTask.Result;
var delayTask2 = DisplayValue2(x);
int y = delayTask2.Result;
DateTime dtEnd = DateTime.Now; Console.Write(x + "|" + y + "|" + (dtEnd - dtBegin).TotalSeconds);
Console.Read();
} #region 方法一
public static async Task<int> DisplayValue()
//public static int DisplayValue()
{
int i = ;
int result = await Task.Run(() =>
{
for (; i < ; i++)
{
Thread.Sleep();
SqlHelper.ExecuteNonQuery("insert into TestTable select '" + i + "'");
}
return i;
});
return result;
}
#endregion #region 方法二
public static async Task<int> DisplayValue2(int x)
//public static int DisplayValue2()
{
int i = ;
var m = await Task.Run(() =>
{
for (; i < ; i++)
{
Thread.Sleep(x);
SqlHelper.ExecuteNonQuery("insert into TestTable select '" + i * + "'");
}
return i;
});
return m;
}
#endregion #region 方法三
//public static async Task DisplayValue3()
public static void DisplayValue3()
{
//await Task.Run(() =>
//{
for (int i = ; i < ; i++)
{
Thread.Sleep();
SqlHelper.ExecuteNonQuery("insert into TestTable select '" + i * + "'");
}
//});
}
#endregion
}
}

我的疑问:下面异步的写法有没有意义??

        public ActionResult TopMenu(string CurrentAppId)
{
//DisplayValue(CurrentAppId);
return View();
} public async Task<ActionResult> TopMenu(string CurrentAppId)
{
return View();
}

2、注意事项

  2.1、僵尸式蔓延,从底层异步,需要衍生到顶部,不要中间层又改成同步,会出现死锁现象

  2.2、多用await,少用.wait()

Framework4.5语法糖 异步Task的更多相关文章

  1. 【.NET异步编程系列1】:await&async语法糖让异步编程如鱼得水

    前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...

  2. 【转】剖析异步编程语法糖: async和await

    一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...

  3. [C#]剖析异步编程语法糖: async和await

    一.难以被接受的async 自从C#5.0,语法糖大家庭又加入了两位新成员: async和await. 然而从我知道这两个家伙之后的很长一段时间,我甚至都没搞明白应该怎么使用它们,这种全新的异步编程模 ...

  4. 【异步编程】Part1:await&async语法糖让异步编程如鱼得水

    前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...

  5. 抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext

    长话短说,本文带大家抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext 引言 C#异步编程语法糖async/await,使开发者很容易就能编写异步代码. ...

  6. javascript异步编程之generator(生成器函数)与asnyc/await语法糖

    Generator 异步方案 相比于传统回调函数的方式处理异步调用,Promise最大的优势就是可以链式调用解决回调嵌套的问题.但是这样写依然会有大量的回调函数,虽然他们之间没有嵌套,但是还是没有达到 ...

  7. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  8. C#6.0语法糖剖析(一)

    1.自动属性默认初始化 使用代码 "; 编译器生成的代码: public class Customer { [CompilerGenerated] private string kBacki ...

  9. C#语法糖(Csharp Syntactic sugar)

    目录 一.C#语法糖大汇总 1. 经过简化的Property2. 经过两次变异的委托写法3. 集合类的声明4. 集合类各个项的操作5. using == try finally6. 可爱的var7. ...

随机推荐

  1. Spring3.0之后->Spring MVC过滤器-HiddenHttpMethodFilter

    浏览器form表单只支持GET与POST请求,而DELETE.PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET.POST.PUT ...

  2. Python 中的map和reduce学习笔记

    map和reduce都是Python中的内置函数 map函数接受两个参数,第一个参数是函数,第二个参数是列表,将函数依次作用于列表中的元素,并返回一个元素 reduce同样以函数和列表作为参数,区别在 ...

  3. Lua string库整理

    string库提供了字符串处理的通用函数. 例如字符串查找.子串.模式匹配等. 当在 Lua 中对字符串做索引时,第一个字符从 1 开始计算(而不是 C 里的 0 ). 索引可以是负数,它指从字符串末 ...

  4. WebView 载入本地的html

    1.可以是用loadData,这种方法需要先将html文件读取出来,以字符串传入loadData,可以展示页面,但是不会引用css.js等文件. 2.使用loadUrl,不过需要注意,这里因为是使用本 ...

  5. 转换成的jar文件接收后台的信息乱码cmd解决办法

    运行——cmd——    java -jar -Dfile.encoding=utf-8 xxx.jar

  6. 转:StrictMode使用

    最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写的应用,并且提供了 ...

  7. 使用sublime遇到的问题汇总

    问题一:用GBK编码的文件用Sublime打开出现中文乱码的解决办法: 通过ctrl+shift+p--package control install安装插件"ConvertToUTF8&q ...

  8. tomcat7 启动项目报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()

    JDK版本:jdk1.8.0_77 Tomcat 版本:apache-tomcat-7.0.47 异常重现步骤: 1.完成项目部署 2.启动Tomcat 异常头部信息:java.lang.NoSuch ...

  9. Http协议:彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    转载:http://mp.weixin.qq.com/s/uWPls0qrqJKHkHfNLmaenQ 导语 Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必 ...

  10. linux find命令

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...