.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
)排队的所有此类套接字,并处理相应的回调
这些想法来自现实世界。假设你是一家酒店的接待员。在同步方法中,您将接受命令并消失,直到得到响应。在异步方法中,您只需接受订单并维护日志。你将永远这样做;每隔一段时间,您就会频繁地查看状态,并对其进行处理
电话怎么知道它是否昂贵
如果您等待,任何输入/输出受限的内容都将在时间上非常昂贵。聪明的操作系统在你们准备好之前不会安排你们的程序。所以,如果你有一些独立的任务,你想做,你需要写你的程序