Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是ThreadPool服务器的async / await?

什么是ThreadPool服务器的async / await?

提问于 2018-02-11 15:58:46
回答 2关注 0查看 582

正在使用同步API和线程池开发一个类似于此的TCP服务器:

代码语言:txt
AI代码解释
复制
TcpListener listener;
void Serve(){
  while(true){
    var client = listener.AcceptTcpClient();
    ThreadPool.QueueUserWorkItem(this.HandleConnection, client);
    //Or alternatively new Thread(HandleConnection).Start(client)
  }
}

假设我的目标是以最低的资源使用率处理尽可能多的并发连接:

代码语言:txt
AI代码解释
复制
async Task Serve(){
  while(true){
    var client = await listener.AcceptTcpClientAsync();
    HandleConnectionAsync(client); //fire and forget?
  }
}

回答 2

社会人就是

回答已采纳

发布于 2018-02-12 00:56:34

while循环不显式地创建任何线程:

代码语言:txt
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

class Program
{
    object _lock = new Object(); // sync lock 
    List<Task> _connections = new List<Task>(); // pending connections

    // The core server task
    private async Task StartListener()
    {
        var tcpListener = TcpListener.Create(8000);
        tcpListener.Start();
        while (true)
        {
            var tcpClient = await tcpListener.AcceptTcpClientAsync();
            Console.WriteLine("[Server] Client has connected");
            var task = StartHandleConnectionAsync(tcpClient);
            // if already faulted, re-throw any error on the calling context
            if (task.IsFaulted)
                task.Wait();
        }
    }

    // Register and handle the connection
    private async Task StartHandleConnectionAsync(TcpClient tcpClient)
    {
        // start the new connection task
        var connectionTask = HandleConnectionAsync(tcpClient);

        // add it to the list of pending task 
        lock (_lock)
            _connections.Add(connectionTask);

        // catch all errors of HandleConnectionAsync
        try
        {
            await connectionTask;
            // we may be on another thread after "await"
        }
        catch (Exception ex)
        {
            // log the error
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            // remove pending task
            lock (_lock)
                _connections.Remove(connectionTask);
        }
    }

    // Handle new connection
    private async Task HandleConnectionAsync(TcpClient tcpClient)
    {
        await Task.Yield();
        // continue asynchronously on another threads

        using (var networkStream = tcpClient.GetStream())
        {
            var buffer = new byte[4096];
            Console.WriteLine("[Server] Reading from client");
            var byteCount = await networkStream.ReadAsync(buffer, 0, buffer.Length);
            var request = Encoding.UTF8.GetString(buffer, 0, byteCount);
            Console.WriteLine("[Server] Client wrote {0}", request);
            var serverResponseBytes = Encoding.UTF8.GetBytes("Hello from server");
            await networkStream.WriteAsync(serverResponseBytes, 0, serverResponseBytes.Length);
            Console.WriteLine("[Server] Response has been written");
        }
    }

    // The entry point of the console app
    static void Main(string[] args)
    {
        Console.WriteLine("Hit Ctrl-C to exit.");
        new Program().StartListener().Wait();
    }
}

或者,代码可能如下所示:

代码语言:txt
AI代码解释
复制
// Handle new connection
private static Task HandleConnectionAsync(TcpClient tcpClient)
{
    return Task.Run(async () =>
    {
        using (var networkStream = tcpClient.GetStream())
        {
            var buffer = new byte[4096];
            Console.WriteLine("[Server] Reading from client");
            var byteCount = await networkStream.ReadAsync(buffer, 0, buffer.Length);
            var request = Encoding.UTF8.GetString(buffer, 0, byteCount);
            Console.WriteLine("[Server] Client wrote {0}", request);
            var serverResponseBytes = Encoding.UTF8.GetBytes("Hello from server");
            await networkStream.WriteAsync(serverResponseBytes, 0, serverResponseBytes.Length);
            Console.WriteLine("[Server] Response has been written");
        }
    });
}

如果这将是一个库代码,那么执行环境确实是未知的

代码语言:txt
AI代码解释
复制
private static Task StartListener()
{
    return Task.Run(async () => 
    {
        var tcpListener = TcpListener.Create(8000);
        tcpListener.Start();
        while (true)
        {
            var tcpClient = await tcpListener.AcceptTcpClientAsync();
            Console.WriteLine("[Server] Client has connected");
            var task = StartHandleConnectionAsync(tcpClient);
            // if already faulted, re-throw any error on the calling context
            if (task.IsFaulted)
                task.Wait();
        }
    });
}

蓝骑士纵横天下

发布于 2018-02-12 01:26:17

建议使用Task.Run(() => HandleConnection(client));

取代await Serve();(例如):

代码语言:txt
AI代码解释
复制
var serverTasks =
    Enumerable.Range(0, Environment.ProcessorCount)
    .Select(_ => Serve());
await Task.WhenAll(serverTasks);
和开发者交流更多问题细节吧,去 写回答
相关文章
什么是Async await,和Promise有什么区别
总结:Async/awati 简单好用,是大势,肯定得学,而async的使用绕不开Promise,所以Promise是必会的。
子夜星辰
2022/11/15
1.5K0
什么是Promise async await我们用它来做什么?
async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await是基于Promise实现的,它不能用于普通的回调函数。 async/await与Promise一样,是非阻塞的。 async/await使得异步代码看起来像同步代码,这正是它的魔力所在。
瑞新
2020/07/07
9970
Thread、ThreadPool、Task、Parallel、Async和Await基本用法、区别以及弊端
ThreadPool是Thread的一个升级版,ThreadPool是从线程池中获取线程,如果线程池中又空闲的元素,则直接调用,如果没有才会创建,而Thread则是会一直创建新的线程,要知道开启一个线程就算什么事都不做也会消耗大约1m的内存,是非常浪费性能的,接下来我们写一个例子来看一下二者的区别:
AI.NET 极客圈
2019/08/14
1.9K0
async和await
先从字面意思来理解。async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。
全栈程序员站长
2022/09/15
1.1K0
async和await
async与await
若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理。
达达前端
2019/08/19
5450
async与await
面试官问 async、await 函数原理是在问什么?
这周看的是 co 的源码,我对 co 比较陌生,没有了解和使用过。因此在看源码之前,我希望能大概了解 co 是什么,解决了什么问题。
若川
2021/09/27
6630
async await语句
在一个被async声明的函数内,await可把一个异步任务(promise)转为同步,阻塞后面的同步代码,让它们等待被await的任务执行完毕,再继续执行
心念
2023/01/11
4300
await和async的机制
当await 会使程序阻塞,等待程序的返回值,异步的程序返回值获取后,才会向下运行。
多凡
2020/06/28
6020
async和await的学习
写一个async的函数: // async 会返回一个Promise对象 async function test(){ // return 相当于resolve return 'test' // throw 相当于reject // throw 'Hello bad' } console.log(test()); console.log('虽然在后面,但是我先执行'); 通过.then来获取async的return值: test().then(res=>{ console.log(res) ///test
biaoblog.cn 个人博客
2022/08/11
4980
谈谈async await的理解!
不过比起Promise之后用then方法来执行相关异步操作,async/await则把异步操作变得更像传统函数操作。
前端老道
2022/03/29
4860
【Flutter】Future, async, await
Dart 为单线程语言,但它提供了异步编程的方式,Future, async, await 为异步编程的类和关键字,
老孟Flutter
2021/07/15
1.3K0
【Flutter】Future, async, await
async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了。但是这也给我们编程埋下了一些隐患,有时候可能会产生一些我们自己都不知道怎么产生的Bug,特别是如果连线程基础没有理解的情况下,更不知道如何去处理了。那今天我们就来好好看看这两兄弟和他们的叔叔(Task)爷爷(Thread)们到底有什么区别和特点,本文将会对Thread 到 Task 再到 .NET 4.5的 async和 await,这三
用户1153966
2018/03/14
7890
async & await 的前世今生(Updated)
async await 续集: await 到底可以接什么?仅仅是 Promise吗?
这个是最基础用法,等待 Promise resolve 或 reject。resolve 后就同步执行,reject 就被 try catch 捕获,或者不处理,由上层调用方法处理。
用户1258909
2021/08/10
1.7K0
async await 的错误处理
async await 从语法层面给人一种非常直观的方式,可以让我们避免 callback hell 与 Promise hell 。
用户1515472
2019/07/24
3.1K0
async与await的原理揭秘
async和await是es7语法,在babel中会被转译,我们看一下专一前和转译后的源码:
挥刀北上
2021/12/10
8440
async与await的原理揭秘
Async,Await和ConfigureAwait的关系
在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用。为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程。虽然async / await让异步编程更简单,但是有一些你可能不知道的细节和注意的地方
leon公众号精选
2022/04/27
7500
Async,Await和ConfigureAwait的关系
JavaScript 的 async/await : async 和 await 在干什么
async 是“异步”的简写,而 await 可以认为是 async wait 的简写。 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。 await 只能出现在 async 函数中。
一个会写诗的程序员
2018/08/17
9930
JavaScript 的 async/await : async 和 await 在干什么
异步函数async await在wpf都做了什么?
首先我们知道async await 异步函数本质是状态机,我们通过反编译工具dnspy,看看反编译的两段代码是否有不同之处:
ryzenWzd
2020/06/08
1.3K0
异步函数async await在wpf都做了什么?
TOKIO ASYNC&AWAIT 初探
rust的async/await终于在万众瞩目之下稳定下来了,一起来尝尝鲜. 这篇文章主要是介绍基于tokio 0.2做一个服务程序员的小工具githubdns.
MikeLoveRust
2019/12/17
1.4K0
异步函数async和await
前面我们介绍的是promise对象,这里我们介绍一下async...await异步函数,创建函数时候使用async关键词表示这是一个异步函数,await必须和async搭配使用
十月梦想
2018/10/09
1.3K0

相似问题

ThreadPool服务器中有类似于异步/等待的命令吗?

2593

服务器开启密码鉴权是指什么?

32.8K

VPS是买云服务器还是什么?

1945

腾讯云服务器访问接口很慢是为什么?

21.1K
相关问答用户
擅长3个领域
高级数据分析师擅长5个领域
腾讯 | 技术专家擅长2个领域
腾讯云TDP | 高级后端开发工程师擅长3个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档