/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

.NET 4.5 使用async和await关键字调用异步方法

2014-06-21 十有三 0 浏览:19695 .NET技术 C#

async和await关键字是.NET 4.5新增加的异步编程方式,通过使用这两个关键字可以轻松便捷的编写异步方法。使用async关键字声明异步方法,使用await关键字等待和获取异步方法返回的结果。需要注意的是,一旦声明了await关键字,将会阻止当前线程直到异步调用返回结果。(点击此处查看MSDN官方说明)

下面的是使用控制台编写的简单测试代码:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("--------------------------------------------------------------------");
            Console.WriteLine("主线程开始执行,时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            Console.WriteLine("--------------------------------------------------------------------");
            /*
            * 主线程调用ShowInfoAsync异步方法
            * 使用async和await关键字
            */
            ShowInfoAsync();
            Console.WriteLine(string.Empty);
            /*同步操作*/
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine(string.Format("主线程同步循环显示序号:{0},时间:{1}", i.ToString(), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
            }

            Console.WriteLine("--------------------------------------------------------------------");
            Console.WriteLine("主线程执行结束,时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            Console.WriteLine("--------------------------------------------------------------------");
            Console.ReadKey();
        }

        /// <summary>
        /// 异步显示输出信息
        /// </summary>
        static async void ShowInfoAsync()
        {            
            
            //声明要调用的异步方法,获取异步任务操作类 Task
            Task<string> getTask = GetDataAsync();

            Console.WriteLine(string.Empty);
            Console.WriteLine(string.Format("开始执行异步获取数据方法,时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));

            /*
             * 异步获取数据并显示
             * 这里使用 await 关键词启用并等待异步返回结果
             * 在声明await关键词的地方线程就会在此等待返回结果
             * 只有返回结果才会继续执行下面步骤
             */
            string strShowString = await getTask;

            Console.WriteLine("***************************************************************");
            Console.WriteLine(string.Format("异步获取数据执行结束,获取数据值:{0},时间:{1}", strShowString, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
            Console.WriteLine("***************************************************************");
            Console.WriteLine(string.Empty);
        }

        /// <summary>
        /// 异步获取返回的数据
        /// </summary>
        /// <returns></returns>
        static async Task<string> GetDataAsync()
        {
            //这里也可以使用Task.Run
            return await Task.Factory.StartNew(() =>
            {
                Thread.Sleep(500);
                string strReturn = string.Empty;
                for (int i = 0; i < 5; i++)
                {
                    Thread.Sleep(500);
                    Console.WriteLine(string.Format("异步获取数据,第{0}次循环,时间:{1}", i + 1, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
                    strReturn += i.ToString();
                }
                return strReturn;
            });
        }                     
    }

最终返回结果如下:

C#使用async和await异步操作演示结果

代码中由于使用async定义了ShowInfoAsync方法,所以ShowInfoAsync就变成一个异步调用的方法,需要注意的是声明了async关键字的方法中一定要使用await关键字声明异步操作的返回结果,否则方法将作为同步方法执行,就不是异步执行了。可以看到代码中await声明的对象是Task<string>这个类,Task<TResult> 类表示一个可以返回值的异步操作,所以代码中GetDataAsync也必须是一个异步方法,而且返回值必须是Task类型或者Task<TResult>。

关于使用这两个关键字官方说明如下:

  • 方法签名包含一个 Async 或 async 修饰符
  • 按照约定,异步方法的名称以“Async”后缀结尾。
  • 返回类型为下列类型之一:
    • 如果你的方法有操作数为 TResult 类型的返回语句,则为 Task<TResult>。
    • 如果你的方法没有返回语句或具有没有操作数的返回语句,则为 Task。
    • 如果你编写的是异步事件处理程序,则为 Void(Visual Basic 中为 Sub)。
    • 有关详细信息,请参见本主题后面的“返回类型和参数”(点击此处看官网完整说明)。
    • 方法通常包含至少一个 await 表达式,该表达式标记一个点,在该点上,直到等待的异步操作完成方法才能继续。 同时,将方法挂起,并且控件返回到方法的调用方。 本主题的下一节将解释悬挂点发生的情况。

这里附上官方MSDN的链接:

  • 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)
  • async(C# 参考)
  • await(C# 参考)

作者:十有三

出处:https://shiyousan.com/post/635389701226393373

版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。


  • 上一篇: C# 中使用Task类进行多线程和异步操作
  • 下一篇: ASP.NET 301跳转或者进行301重定向/转向的方法

相关文章
  • .NET 4.5 使用async和await关键字调用异步方法
  • ASP.NET MVC实现IExceptionFilter接口编写自定义异常处理过滤器
  • 解决VS2013编码遇到无法嵌入互操作类型“ChinaPay_NET.NetPayClientClass”请改用适用的接口的问题
  • Web 部署任务失败 未能使用指定的进程“Web Management Service”连接到远程计算机
  • Visual Studio 2013 社区版和速成版之间的区别
  • ASP.NET MVC如何实现带www域名重定向到不带www顶级域名
发表评论
记住昵称

文章分类

.NET技术 122 数据库 24 Web前端 21 网站建设运维 33 操作系统与应用 67 程序猿日常 11 开发工具 11 其他随笔 13

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 道学 佛经 服务器 搞笑娱乐 好文分享 软件应用 生活知识 诗词 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • VS重构重命名的快捷键
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • jquery ajax error函数和及其参数详细说明
  • Win10中如何设置Hyper-V的网络让虚拟机也能上外网

推荐文章

  • 解决系统启动出现 Loading Operating System Boot From CD/DVD 导致无法开机问题
  • 记录MongoDb连接错误System.TimeoutException: A timeout occured after 30000ms selecting a server
  • 简单处理VS2013无法启动 IIS Express Web的问题
  • ASP.NET 在.aspx页面中使用<script runat="server"></script>标记
  • IIS 8.5的配置文件存放路径

最新评论

  • 谢谢了。第一次遇到,以前怎么不会出现这种情况呢,奇
  • 第一种方法解决问题。在开始菜单里重置为默认的推荐浏
  • 使用百度分享按钮动态分享的时候永远默认分享最后一条
  • 使用百度分享按钮动态分享的时候永远默认分享最后一条
  • 非常感谢

友情链接

  • Wil的博客
  • Passingwind的博客
  • 坤哥网
  • .NET开发者社区

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号