异步和多线程的应用场景总结
结论:
计算密集型工作,采用多线程。
IO密集型工作,采用异步机制。
原因:
要理解这一点,需要从“IO操作的DMA(Direct Memory Access)模式”开始讲起。DMA即直接内存访问,是一种不经过CPU而直接进行内存数据存储的数据交换模式。通过DMA的数据交换几乎可以不损耗CPU的资源。在硬件中,硬盘、网卡、声卡、显卡等都有DMA功能。CLR所提供的异步编程模型就是让我们充分利用硬件的DMA功能来释放CPU的压力。
举例:
1)多线程
private void
buttonGetPagebyThread_Click(object sender, EventArgs e)
{
Thread
t = new Thread(() =>
{
var request =
HttpWebRequest.Create("http://www.cnblogs.com/my-opinion");
var response
= request.GetResponse();
var stream =
response.GetResponseStream();
using (StreamReader reader = new
StreamReader(stream))
{
operateGUI(reader);
}
});
t.Start();
}
private void operateGUI(StreamReader reader)
{
StringBuilder content = new StringBuilder();
while
(reader.Peek() >=
0)
{
content.Append(reader.ReadLine());
}
Action<string> action = delegate(string
s)
{
rb_Content.AppendText(s);
};
if
(rb_Content.InvokeRequired)
{
rb_Content.Invoke(action,
content.ToString());
}
else
{
rb_Content.AppendText(content.ToString());
}
}
2)异步
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))
{
operateGUI(reader);
}
}
private void operateGUI(StreamReader
reader)
{
StringBuilder content = new StringBuilder();
while
(reader.Peek() >=
0)
{
content.Append(reader.ReadLine());
}
Action<string> action = delegate(string
s)
{
rb_Content.AppendText(s);
};
if
(rb_Content.InvokeRequired)
{
rb_Content.Invoke(action,
content.ToString());
}
else
{
rb_Content.AppendText(content.ToString());
}
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。