使用概述

C#的使用过程中,除了以前的Thread、ThreadPool等用来开一个线程用来处理异步的内容。还可以使用新特性来处理异步。比以前的Thread和AutoResetEvent、delegete一起使用要方便一些。

以前如果使用Thread、AutoResetEvent用来使用异步处理一个任务是如下写发。

static AutoResetEvent a1 = new AutoResetEvent(false);
static void Main(string[] args)
{
Thread th = new Thread(new ThreadStart(method));
th.Start();
Console.WriteLine("start.."+DateTime.Now.ToString("mm:ss fff"));
bool isback = a1.WaitOne(2000,false);
Console.WriteLine("end .." + DateTime.Now.ToString("mm:ss fff")+ isback);
Console.Read();
}
//do something
static void method()
{
Thread.Sleep(4000); //超时返回
Console.WriteLine("Async.." + DateTime.Now.ToString("mm:ss fff"));
a1.Set();
}

再新开一个线程处理耗时比较长的业务,线程同步用AutoResetEvent来处理,如果超时使用WaitOne来处理,线程间数据传递用Delegate.开的东西比较多,同步的东西也比较多。从.net 4.0开始引入另外一种方法来处理Task,使用的是线程池里的东西,写法比以前方便点。

Task使用

static void Main(string[] args)
{
Console.WriteLine("main in");
var result = costtime();
Console.WriteLine("back main");
//waittime true 正常返回 false 超时自动过去
bool waittime = result.Wait(1000);
Console.WriteLine("main out-" + waittime);
Console.Read();
} private static async Task<string> costtime()
{
Console.WriteLine("cost time in");
await Task.Run(() =>
{
Thread.Sleep(3000);
Console.WriteLine("in other method");
});
Console.WriteLine("cost time out");
return "fuck you";
}

测试结果

调用方法异步方法跟普通方法一样使用,不过异步方法一般需要返回支持Task,Task<T>;方法内部耗时方法使用await标志一下。如果是Task为空不需要显式的返回东西。

如果有参数,可以承接异步方法间通讯

var result = costtime();

返回的Task<string>,方法的执行顺序是 主执行到调用,从方法执行到await,返回一个Task标记,然后等待一定时间。超时了主方法执行接下来的动作,不再等待从方法。主方法完成,从方法完成。

result.Wait(1000);

wait如果写入时间就是超时时间,如果不写入时间就是一直等待从方法完成。

主方法不能继续的写法

倘若返回结果稍微写一种方式,可能让主方法设置的超时时间无效

static void Main(string[] args)
{
Console.WriteLine("main in");
var result = costtime();
Console.WriteLine("back main");
//waittime true 正常返回 false 超时自动过去
bool waittime = result.Wait(1000);
Console.WriteLine("main out-" + waittime+"-"+result.Result);
Console.Read();
} private static async Task<string> costtime()
{
Console.WriteLine("cost time in");
await Task.Run(() =>
{
Thread.Sleep(5000);
Console.WriteLine("in other method");
});
Console.WriteLine("cost time out");
return "fuckyou";
}

执行程序返回的结果如下

多加了返回的结果,虽然已经超时,也完成超时的状态更新,但是还是不会完整主方法的执行,因为返回的值只是一个标志位,如果主方法要用就得等从方法填充数据。如果没有填充数据,此时是个异常,而结构上不允许。所以如果超时最好自定义返回的数据,否则可能造成一直等待。

async await Task 使用方法的更多相关文章

  1. async/await Task Timeout

    async/await Task Timeout 在日常的电脑使用过程中,估计最难以忍受的就是软件界面"卡住""无响应",在我有限的开发生涯中一直都是在挑战 它 ...

  2. async,await,Task 的一些用法

    async,await,Task 的一些用法 private void Form1_Load(object sender, EventArgs e) { Display(); } public asy ...

  3. C#扫盲篇(四):.NET Core 的异步编程-只讲干货(async,await,Task)

    关于async,await,task的用法和解释这里就不要说明了,网上一查一大堆.至于为啥还要写这篇文章,主要是其他文章水分太多,不适合新手学习和理解.以下内容纯属个人理解,如果有误,请高手指正.本文 ...

  4. async await Task

    一.使用Task 引用命名空间 using System.Threading.Tasks; 1.工厂方式 Task.Factory.StartNew(() => {Console.WriteLi ...

  5. async await task.Result 卡死

    在如下代码中: public async Task<string> GetData() { return await DoWork(); } 在UI线程中调用 var data = Get ...

  6. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  7. C#多线程和异步(二)——Task和async/await详解(转载)

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  8. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  9. C#多线程和异步——Task和async/await详解

    阅读目录 一.什么是异步 二.Task介绍 1 Task创建和运行 2 Task的阻塞方法(Wait/WaitAll/WaitAny) 3 Task的延续操作(WhenAny/WhenAll/Cont ...

随机推荐

  1. tfrecords转np.array

    import tensorflow as tf import numpy as np from keras.utils import to_categorical import sys def tfr ...

  2. JavaScript for, for...in, for...of, for-await...of difference All In One

    JavaScript for, for...in, for...of, for-await...of difference All In One for for...in for...of for-a ...

  3. qt 取进程列表,读写内存, 写字节集

    导入库 pro win32:LIBS += -lpsapi win32:LIBS += -lkernel32 获取列表 #include "mainwindow.h" #inclu ...

  4. PHP实现一个二维码同时支持支付宝和微信支付

    实现思路 生成一个二维码,加入要处理的url连接 在用户扫完码后,在对应的脚本中,判断扫码终端,调用相应的支付 若能够扫码之后能唤起相应app,支付宝要用手机网站支付方式,微信要使用jsapi支付方式 ...

  5. NGK” 呼叫河马 “智能合约火爆全网

    最近有一款基于NGK.IO公链上的智能合约"呼叫河马"在区块链市场很火.通过访问和查阅资料可知,"呼叫河马"是一款全新的智能合约Dapp小游戏,智能合约代码是1 ...

  6. Elasticsearch 分片集群原理、搭建、与SpringBoot整合

    单机es可以用,没毛病,但是有一点我们需要去注意,就是高可用是需要关注的,一般我们可以把es搭建成集群,2台以上就能成为es集群了.集群不仅可以实现高可用,也能实现海量数据存储的横向扩展. 新的阅读体 ...

  7. eclipse中将项目加载到tocat报错:Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules

    第一种解决方法:只需要找到导入项目的配置文件即可,举个栗子:D:\公司\iptv_gx\iptv_gx\.settings\org.eclipse.wst.common.project.facet.c ...

  8. Vue学习笔记-VSCode安装与配置

    一  使用环境: windows 7 64位操作系统 二  VSCode安装与配置  1.下载: https://code.visualstudio.com 直接点击即可. 2. 点击按装程序,默认安 ...

  9. 微信小程序:标签字符串直接变成标签来显示要通过富文本技术

    rich-text标签存在nodes属性直接接受标签字符串

  10. Win32API使用技巧 -- 置顶应用

    Win32提供了SetForegroundWindow方法可以将应用设置到前台并激活,但是在某些场景下,只调用该接口会返回0,即设置失败.比如如下场景: 当前前台应用为一个全屏的应用,非前台应用的进程 ...