Asynchronous 异步/等待创建的C#任务不会创建单独的线程。还有什么办法能让你记住一幅画呢?

Asynchronous 异步/等待创建的C#任务不会创建单独的线程。还有什么办法能让你记住一幅画呢?,asynchronous,concurrency,async-await,Asynchronous,Concurrency,Async Await,据 由等待执行的C#任务。。。不会为目标任务创建单独的线程。然而,我观察到,这样的任务不是每次都从同一个线程执行,而是可以切换它的线程 我还是不明白发生了什么事 public class TestProgram { private static async Task HandleClient(TcpClient clt) { using NetworkStream ns = clt.GetStream(); using StreamReader

由等待执行的C#任务。。。不会为目标任务创建单独的线程。然而,我观察到,这样的任务不是每次都从同一个线程执行,而是可以切换它的线程

我还是不明白发生了什么事

public class TestProgram
{
    private static async Task HandleClient(TcpClient clt)
    {
        using NetworkStream ns = clt.GetStream();
        using StreamReader sr = new StreamReader(ns);
        while (true)
        {
            string msg = await sr.ReadLineAsync();
            Console.WriteLine($"Received in {System.Threading.Thread.CurrentThread.ManagedThreadId} :({msg.Length} bytes):\n{msg}");
        }
    }
    private static async Task AcceptConnections(int port)
    {
        TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
        listener.Start();
        while(true)
        {
            var client = await listener.AcceptTcpClientAsync().ConfigureAwait(false);
            Console.WriteLine($"Accepted connection for port {port}");
            var task = HandleClient(client);
        }
    }

    public async static Task Main(string[] args)
    {

        var task1=AcceptConnections(5000);
        var task2=AcceptConnections(5001);

        await Task.WhenAll(task1, task2).ConfigureAwait(false);
    }
}
此示例代码为端口5000和5001创建两个侦听器。每个接口都可以接受多个连接,并独立于创建的套接字进行读取

也许这并不“好”,但它是有效的,我观察到,从不同套接字接收的消息有时在同一个线程中处理,用于执行的线程甚至会发生变化

Accepted connection for port 5000
Accepted connection for port 5000
Accepted connection for port 5001
Received new message in 5 :(17 bytes):
Port-5000 Message from socket-1
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-1
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-1
Received new message in 7 :(20 bytes):
Port-5000 Message  from socket-2
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-2
Received new message in 7 :(18 bytes):
Port-5001 Message  from socket-3
Received new message in 8 :(17 bytes):
Port-5001 Message  from socket-3

(texts manually edit for clarity, byte lengths are not valid)
如果负载很重(我还没有测试它),那么要执行这些并行任务需要多少线程?我听说了一个线程池,但不知道如何对它产生一些影响

或者问这个问题是完全错误的,我根本不必关心使用了什么特定的线程,以及涉及了多少线程

由等待执行的C#任务。。。不会为目标任务创建单独的线程

一个重要的纠正:任务不是由
wait
执行的<代码>等待被消费代码用于执行“异步等待”;i、 例如,暂停当前方法,并在任务完成后恢复该方法

我观察到,这样的任务不是每次都从同一个线程执行,而是可以切换它的线程

我观察到,从不同套接字接收的消息有时在同一个线程中处理,用于执行的线程甚至会发生变化

Accepted connection for port 5000
Accepted connection for port 5000
Accepted connection for port 5001
Received new message in 5 :(17 bytes):
Port-5000 Message from socket-1
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-1
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-1
Received new message in 7 :(20 bytes):
Port-5000 Message  from socket-2
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-2
Received new message in 7 :(18 bytes):
Port-5001 Message  from socket-3
Received new message in 8 :(17 bytes):
Port-5001 Message  from socket-3

(texts manually edit for clarity, byte lengths are not valid)
任务没有在任何地方“执行”。但是
async
方法中的代码必须运行,并且必须在线程上运行。控制台应用程序没有上下文,因此该方法将在任何可用的线程池线程上恢复

如果负载很重(我还没有测试它),那么要执行这些并行任务需要多少线程?我听说了一个线程池,但不知道如何对它产生一些影响

或者问这个问题是完全错误的,我根本不必关心使用了什么特定的线程,以及涉及了多少线程

你通常不必知道;只要你的代码没有阻塞线程池线程,你就可以正常工作。需要注意的是,在执行I/O时(例如,在侦听/接受新的TCP套接字时)正在使用零线程。线程池线程仅在需要时借用

在大多数情况下,你不必担心它。但是如果你需要的话,它有几个旋钮可以调整

由等待执行的C#任务。。。不会为目标任务创建单独的线程

一个重要的纠正:任务不是由
wait
执行的<代码>等待被消费代码用于执行“异步等待”;i、 例如,暂停当前方法,并在任务完成后恢复该方法

我观察到,这样的任务不是每次都从同一个线程执行,而是可以切换它的线程

我观察到,从不同套接字接收的消息有时在同一个线程中处理,用于执行的线程甚至会发生变化

Accepted connection for port 5000
Accepted connection for port 5000
Accepted connection for port 5001
Received new message in 5 :(17 bytes):
Port-5000 Message from socket-1
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-1
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-1
Received new message in 7 :(20 bytes):
Port-5000 Message  from socket-2
Received new message in 7 :(18 bytes):
Port-5000 Message  from socket-2
Received new message in 7 :(18 bytes):
Port-5001 Message  from socket-3
Received new message in 8 :(17 bytes):
Port-5001 Message  from socket-3

(texts manually edit for clarity, byte lengths are not valid)
任务没有在任何地方“执行”。但是
async
方法中的代码必须运行,并且必须在线程上运行。控制台应用程序没有上下文,因此该方法将在任何可用的线程池线程上恢复

如果负载很重(我还没有测试它),那么要执行这些并行任务需要多少线程?我听说了一个线程池,但不知道如何对它产生一些影响

或者问这个问题是完全错误的,我根本不必关心使用了什么特定的线程,以及涉及了多少线程

你通常不必知道;只要你的代码没有阻塞线程池线程,你就可以正常工作。需要注意的是,在执行I/O时(例如,在侦听/接受新的TCP套接字时)正在使用零线程。线程池线程仅在需要时借用

在大多数情况下,你不必担心它。但是如果你需要的话,它有几个旋钮可以调整