异步方法的编写与使用

一、异步方法的编写
a) 如果需要使用await,则方法必须用async修饰。控制器、事件处理函数这些都可以使用async,但Main函数却不能。如果需要在Mainh函数中调用异步方法,可以使用Result属性,比如:

HttpClient hc = new HttpClient();
var taskMsg = hc.GetAsync("http://www.bing.com");
var taskRead = taskMsg.Result;

这样写的结果貌似await hc.GetAsync...相同,但await时是释放掉线程,而使用.Result却是让线程暂停(block),可见无法发挥异步的作用,还容易因上下文切换导致死锁。不是很理解,还需要在后续的使用中领悟了。
b)编写异步方法有几种形式,典型的如:

static Task<HttpResponseMessage> Test4Async() {
  HttpClient hc = new HttpClient();
  var taskMsg = hc.GetAsync("http://www.bing.com");
  return taskMsg;
}

返回Task<T>以供后续处理。
对于HttpClient请求,也可以直接返回HttpResponseMessage,需要配合使用async和await

static async Task<HttpResponseMessage> Test4Async() {
  HttpClient hc = new HttpClient();
  var taskMsg =await hc.GetAsync("http://www.rupeng.com");
  return taskMsg;
}

c)另外还有Task.Run/FromResult方法

static Task<int> Test1Async() {
  return Task.Run(() => {
    return 1 + 1;
  });
}


static Task<int> Test2Async() {
  return Task.FromResult(3);
}

Task.Run的参数为Action,看来与thread.Start()来执行被指向的函数是一个原理。

二、异步方法的使用
asp.net中使用async可以提升网站的吞吐量(网站可够应对更高的并发量)。MVC、WebAPI的控制器都是可以用async修饰的,EF提供了异步操作的方法。
a)MVC中可以只需用Task<>包装IActionResult即可

public async Task<IActionResult> Index() {
  using (FileStream stream = System.IO.File.OpenRead("d:/ckcore.txt"))
  using (StreamReader st = new StreamReader(stream)) {
    string txt =  st.ReadToEndAsync();
    return Content(txt);
  }
}


b)EF也为增删改查准备了异步方法,比如SaveChangesAsync、FirstAsync、ForeachAsync等。
c)异步一定要“彻底”,一个标记了async的方法,其整个调用链上的方法都要是异步的。.Result这样的用法会抵消异步带来的好处。


学习资料:如鹏网.net提高班http://www.rupeng.com/News/10/4603.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在WinForms中,可以使用异步方式来编写HTTP协议服务端,以便不会阻塞UI线程。 以下是一个简单的例子,演示如何使用异步方式编写HTTP协议服务端: ```csharp public partial class Form1 : Form { private HttpListener httpListener; public Form1() { InitializeComponent(); } private async void btnStart_Click(object sender, EventArgs e) { try { httpListener = new HttpListener(); httpListener.Prefixes.Add("http://localhost:8080/"); httpListener.Start(); txtStatus.Text = "HTTP server is running on port 8080."; while (true) { HttpListenerContext context = await httpListener.GetContextAsync(); Task.Run(() => ProcessRequest(context)); } } catch (Exception ex) { txtStatus.Text = "Error: " + ex.Message; } } private void ProcessRequest(HttpListenerContext context) { try { string responseString = "<html><body><h1>Hello, World!</h1></body></html>"; byte[] buffer = Encoding.UTF8.GetBytes(responseString); context.Response.ContentLength64 = buffer.Length; context.Response.OutputStream.Write(buffer, 0, buffer.Length); context.Response.OutputStream.Close(); } catch (Exception ex) { // Handle exception } } private void btnStop_Click(object sender, EventArgs e) { httpListener.Stop(); txtStatus.Text = "HTTP server stopped."; } } ``` 在上面的例子中,我们使用了HttpListener类来创建一个HTTP协议服务端,并监听端口8080。在启动按钮的Click事件中,我们使用async关键字来异步处理HTTP请求,并使用Task.Run方法来处理每个请求。在处理HTTP请求的方法中,我们简单地返回一个包含“Hello, World!”文本的HTML响应。在停止按钮的Click事件中,我们停止HttpListener并更新状态文本框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值