如果我们修改一下代码,使用异步模式去实现,代码如下所示:
private void buttonGetPage_Click(object sender, EventArgs e)
{
var request = HttpWebRequest.Create("http://www.sina.com.cn");
request.BeginGetResponse(this.AsyncCallbackImpl, request);
}
public void AsyncCallbackImpl(IAsyncResult ar)
{
WebRequest request = ar.AsyncState as WebRequest;
var response = request.EndGetResponse(ar);
var stream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(stream))
{
var content = reader.ReadLine();
textBoxPage.Text = content;
}
} |
以上代码的工作机制可以用图6-2来描述。
图6-2 异步工作的机制
经过修改的示例采用了异步模式,它使用线程池进行管理。新起异步操作后,CLR会将工作丢给线程池中的某个工作线程来完成。当开始I/O操作的时候,异步会将工作线程还给线程池,这时候就相当于获取网页的这个工作不会再占用任何CPU资源了。直到异步完成,即获取网页完毕,异步才会通过回调的方式通知线程池,让CLR响应异步完毕。可见,异步模式借助于线程池,极大地节约了CPU的资源。
明白了异步和多线程的区别后,我们来确定两者的应用场景:
计算密集型工作,采用多线程。
IO密集型工作,采用异步机制。
相关链接:
改善C#程序的157个建议(连载1)
改善C#程序的157个建议(连载2)
改善C#程序的157个建议(连载3)
改善C#程序的157个建议(连载4)
改善C#程序的157个建议(连载5)
改善C#程序的157个建议(连载6)
改善C#程序的157个建议(连载7)
改善C#程序的157个建议(连载8)
改善C#程序的157个建议(连载9)
改善C#程序的157个建议(连载10)
改善C#程序的157个建议(连载11)
改善C#程序的157个建议(连载12)
改善C#程序的157个建议(连载13)
改善C#程序的157个建议(连载14)
改善C#程序的157个建议(连载15)