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

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

2014-06-21 十有三 0 浏览:2万+ .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重定向/转向的方法

相关文章
  • Visual Studio Community 2013 微软官方Q&A 英汉翻译对照
  • Visual Studio 2013 社区版和速成版之间的区别
  • ASP.NET MVC移除URL后面自动加上的AspxAutoDetectCookieSupport=1
  • .NET项目在生成时如何将静态资源文件复制到输出目录
  • ASP.NET .exclude 是什么文件?
  • ASP.NET MVC 获取及手动更新AntiForgeryToken防伪标记

文章分类

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

文章标签

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

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • VS重构重命名的快捷键
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件

推荐文章

  • C#解决IIS域名批量绑定
  • 操作系统和URL中斜杠/和反斜杠\之间的区别以及运用
  • SQL 获取上一条数据
  • 解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题
  • 解决ASP.NET MVC异常:提供的防伪标记适用于用户“*”,但当前用户为“”

友情链接

  • Passingwind的博客
  • 码友网

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