基于任务的异步模式(TAP)
Task
.net 4.0为我们带来了Task的异步,我们有以下三种方法创建Task。
1,Task.Factory.StartNew,比较常用。
2,Task.Run,是.net 4.5中增加的。
3,Task.FromResult,如果结果是已计算,就可以使用这种方法来创建任务。
下面就以Task.Factory.StartNew继续来实现前面的那个例子,代码如下。
1 /// <summary>
2 /// 使用Task,Task.Factory.StartNew,会创建新的线程
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void button4_Click(object sender, EventArgs e)
7 {
8 this.richTextBox1.Text = "正在处理请求...";
9
10 Task.Factory.StartNew(() =>
11 {
12 //下面这段代码可封装一下,一个没有返回值的方法
13 var url = this.textBox1.Text.Trim();
14 var request = HttpWebRequest.Create(url);
15 var response = request.GetResponse();
16 var stream = response.GetResponseStream();
17 using (StreamReader reader = new StreamReader(stream))
18 {
19 var content = reader.ReadToEnd();
20 this.richTextBox1.Text = content;
21 }
22 });
23 }
Task相较ThreadPool线程池使用更简单,而且支持线程的取消,完成和失败通知等交互性操作,而这些是ThreadPool所没有的。并且Task是可以有返回值的。
async/await
async&await是.net 4.5新增的特性,
下面还是使用async&await实现一遍之前的例子,代码如下。
1 /// <summary>
2 /// 使用async/await
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private async void button5_Click(object sender, EventArgs e)
7 {
8 this.richTextBox1.Text = "正在处理请求...";
9
10 await DoWorkAsync();
11 }
12
13 public async Task DoWorkAsync()
14 {
15 var url = this.textBox1.Text.Trim();
16 var request = HttpWebRequest.Create(url);
17 var response = request.GetResponse();
18 var stream = response.GetResponseStream();
19 using (StreamReader reader = new StreamReader(stream))
20 {
21 var content = reader.ReadToEnd();
22 this.richTextBox1.Text = content;
23 }
24 }
有以下疑问:
1,看起来使用了async,UI线程还是会阻塞?
2,使用async并没有创建一个新的线程?
漫思

浙公网安备 33010602011771号