博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步编程Task
阅读量:6224 次
发布时间:2019-06-21

本文共 2473 字,大约阅读时间需要 8 分钟。

尽量使用异步编程(ASYNC-AWAIT)

 

异步编程模型是在C#5.0中引入的,并变得非常流行。ASP.NET Core使用相同的异步编程范例来使应用程序更可靠、更快和更稳定。

您应该在代码中使用端到端异步编程。

让我们举一个例子;我们有一个ASP.NET CoreMVC应用程序,中间有一些数据库的操作。正如我们所知道的,它可能有很多分层结构,这都取决于用户的项目架构,但是让我们举一个简单的例子,其中我们有Controller》Repository 层等等。让我们看看如何在控制器层编写示例代码。

[HttpGet] [Route("GetPosts")]  public async Task GetPosts() { try  { var posts = await postRepository.GetPosts(); if (posts == null)  { return NotFound();  } return Ok(posts);  } catch (Exception)  { return BadRequest();  } }

接下来的代码然是了我们如何在repository  层实现异步编程。

public async Task
> GetPosts() { if (db != null) { return await (from p in db.Post from c in db.Category where p.CategoryId == c.Id select new PostViewModel { PostId = p.PostId, Title = p.Title, Description = p.Description, CategoryId = p.CategoryId, CategoryName = c.Name, CreatedDate = p.CreatedDate }).ToListAsync(); } return null; }

 

使用异步编程避免TASK.WAIT或TAST.RESULT

在使用异步编程时,我建议您避免使用Task.Wait和Task.Result并尝试使用WAIT,原因如下:

  1. 它们阻塞线程直到任务完成,并等待任务完成。等待同步阻塞线程,直到任务完成。

  2. Wait 和 Task.Result 在AggregateException中包含所有类型的异常,并在在执行异常处理时增加复杂性。如果您使用的是等待await 而不是 Task.Wait和Task.Result的话,那么您就不必担心异常的处理了。

  3. 有时,它们都会阻塞当前线程并创建死锁。

  4. 只有在并行任务执行正在进行时才能使用Wait 和Task.Result 。我们建议您不要在异步编程中使用它。

下面让我们分别演示下正确使用以及不建议使用Task.Wait 的例子,来加深理解吧!

// 正确的例子 Task task = DoWork(); await task; // 不建议使用的例子 Task task = DoWork(); task.Wait();

下面让我们分别演示下正确使用以及不规范使用Task.Result 的例子,来加深理解吧!

// Good Performance on UI  Task
task = GetEmployeeName(); txtEmployeeName.Text = await task; // Bad Performance on UI Task
task = GetEmployeeName(); txtEmployeeName.Text = task.Result;

异步执行I/O操作

 

在执行I/O操作时,您应该异步执行它们,这样就不会影响其他进程。I/O操作意味着对文件执行一些操作,比如上传或检索文件。它可以是任何操作如:图像上传,文件上传或其他任何操作。如果您试图以同步的方式完成它,那么它会阻塞主线程并停止其他后台执行,直到I/O完成为止。因此,从提升性能上来说,您在对I/O进行操作时应该始终进行异步执行。

我们有很多异步方法可用于I/O操作,如ReadAsync、WriteAsync、FlushAysnc等。下面是一个简单的例子,说明我们如何异步创建一个文件的副本。

public async void CreateCopyOfFile() { string dir = @"c:\Mukesh\files\"; using (StreamReader objStreamReader= File.OpenText(dir + "test.txt"))  { using (StreamWriter objStreamWriter= File.CreateText(dir+ "copy_test.txt"))  { await CopyFileToTarget(objStreamReader, objStreamWriter);  }  } } public async Task CopyFileToTarget(StreamReader objStreamReader, StreamWriter objStreamWriter) { int num; char[] buffer = new char[0x1000]; while ((num= await objStreamReader.ReadAsync(buffer, 0, buffer.Length)) != 0)  { await objStreamWriter.WriteAsync(buffer, 0, num);  } }

转载于:https://www.cnblogs.com/laoer/p/10547579.html

你可能感兴趣的文章
基于SDN,NFV的服务感知网络架构下篇
查看>>
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
查看>>
VMware Agent 安装完成后,RDP无法连接
查看>>
apache+多版本php
查看>>
关于测试人员的职业发展
查看>>
C++与C#数据类型比较总结
查看>>
Try .NET & Github Gist
查看>>
Windows页目录自映射方案
查看>>
java 线程之executors线程池
查看>>
about lesscss~
查看>>
ubuntu 系统的一些错误解决
查看>>
MongoDB学习记录
查看>>
字符串
查看>>
如何在Ubuntu/CentOS上安装Linux内核4.0
查看>>
redis实现简单的消息队列(php)
查看>>
MySQL索引的创建、删除和查看
查看>>
汇编 ret,retf和call
查看>>
Java OCR(使用Tess4J)
查看>>
盘点selenium phantomJS使用的坑
查看>>
谈谈angular项目构建中的组织结构
查看>>