.net 单线程异步编程

.net 单线程异步编程,.net,asynchronous,async-await,.net,Asynchronous,Async Await,我试图通过以下方式理解异步编程的概念 这些是我的发现: 用于执行非阻塞调用 每当执行一个昂贵的请求并且需要更长的时间时,异步调用就会返回给调用者并执行其他操作,当异步请求完成时,它会返回数据 所有进程都在单个线程中进行 此外,我还尝试通过以下代码复制此概念: private async void button1_Click(object sender, EventArgs e) { Task<int> contentLength = mainM

我试图通过以下方式理解异步编程的概念 这些是我的发现:

  • 用于执行非阻塞调用
  • 每当执行一个昂贵的请求并且需要更长的时间时,异步调用就会返回给调用者并执行其他操作,当异步请求完成时,它会返回数据
  • 所有进程都在单个线程中进行
  • 此外,我还尝试通过以下代码复制此概念:

    private async void button1_Click(object sender, EventArgs e)
            {
                Task<int> contentLength = mainMethod();
                Console.WriteLine("button_click");
                int length = await contentLength;
                Console.WriteLine(length);
            }
    
            private async Task<int> mainMethod()
            {
                int contentLength = await AccessWebsiteAync();
                Console.WriteLine("main method");
                return contentLength;
            }
    
            async Task<int> AccessWebsiteAync()
            {
                HttpClient client = new HttpClient();
                Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
                string urlContents = await getStringTask;
                return urlContents.Length;
            }
    
    output : button_click
            main method
            40692
    
    private async void按钮1\u单击(对象发送方,事件参数e)
    {
    任务contentLength=main方法();
    控制台写入线(“按钮点击”);
    int-length=等待内容长度;
    控制台写入线(长度);
    }
    专用异步任务main方法()
    {
    int contentLength=await AccessWebsiteAync();
    Console.WriteLine(“主方法”);
    返回内容长度;
    }
    异步任务访问WebSiteAync()
    {
    HttpClient=新的HttpClient();
    任务getStringTask=client.GetStringAsync(“http://msdn.microsoft.com");
    字符串urlContents=等待getStringTask;
    返回urlContents.Length;
    }
    输出:点击按钮
    主要方法
    40692
    
    基于我的理解和上述产出,以下是我的疑问:

  • 这是
    client.GetStringAsync(“http://msdn.microsoft.com");一个昂贵的呼叫,因此它将返回给呼叫方并
    按一下按钮打印。电话怎么知道它是否昂贵
  • 它在哪里存储付费呼叫的状态,以及以后如何检索昂贵呼叫
  • 如何在后台执行昂贵的呼叫

  • 我知道我的理解很混乱。有什么建议吗

    与其直接学习
    异步
    等待
    ,不如了解一下异步编程的真正含义。如果你对Python很在行的话,有一个很好的方法

    网络调用是一种输入/输出(I/O)操作,即使它不消耗中央处理器(CPU),也需要时间。在引擎盖下,操作系统(OS)将程序从执行中移除,直到它准备就绪。如果您只需要做一个网络调用,那么这种方法就可以了(即您的程序只有一个输入)。如果您的程序要处理多个I/O,那么这种方法是不好的。如果您像这样放弃控制,那么您就浪费了程序的时间(从操作系统调度程序获得的份额之外)。因此,您可以通过让您的程序创建一个网络套接字、发送请求、在队列中监视它并继续进行,从而变得智能且响应迅速。该程序将持续监视使用一些API(如
    select
    )排队的所有此类套接字,并处理相应的回调

    这些想法来自现实世界。假设你是一家酒店的接待员。在同步方法中,您将接受命令并消失,直到得到响应。在异步方法中,您只需接受订单并维护日志。你将永远这样做;每隔一段时间,您就会频繁地查看状态,并对其进行处理

    电话怎么知道它是否昂贵

    如果您等待,任何输入/输出受限的内容都将在时间上非常昂贵。聪明的操作系统在你们准备好之前不会安排你们的程序。所以,如果你有一些独立的任务,你想做,你需要写你的程序的基础上。如果它是CPU受限的,那么不要以异步方式进行

    它在哪里存储昂贵电话的状态

    就您的程序而言,您可以将其抽象为套接字或文件描述符,并监视它是否准备就绪。其余部分由操作系统和其他相关服务器完成

    如何在后台执行昂贵的呼叫


    操作系统负责TCP/IP处理,真正的计算由网络中的另一台服务器完成。

    与其直接学习
    异步
    等待
    ,不如了解一下异步编程的真正含义。如果你对Python很在行的话,有一个很好的方法

    网络调用是一种输入/输出(I/O)操作,即使它不消耗中央处理器(CPU),也需要时间。在引擎盖下,操作系统(OS)将程序从执行中移除,直到它准备就绪。如果您只需要做一个网络调用,那么这种方法就可以了(即您的程序只有一个输入)。如果您的程序要处理多个I/O,那么这种方法是不好的。如果您像这样放弃控制,那么您就浪费了程序的时间(从操作系统调度程序获得的份额之外)。因此,您可以通过让您的程序创建一个网络套接字、发送请求、在队列中监视它并继续进行,从而变得智能且响应迅速。该程序将持续监视使用一些API(如
    select
    )排队的所有此类套接字,并处理相应的回调

    这些想法来自现实世界。假设你是一家酒店的接待员。在同步方法中,您将接受命令并消失,直到得到响应。在异步方法中,您只需接受订单并维护日志。你将永远这样做;每隔一段时间,您就会频繁地查看状态,并对其进行处理

    电话怎么知道它是否昂贵

    如果您等待,任何输入/输出受限的内容都将在时间上非常昂贵。聪明的操作系统在你们准备好之前不会安排你们的程序。所以,如果你有一些独立的任务,你想做,你需要写你的程序