.Net await/async问题

Recoding
  • 417
int Main()
{
    var task = Task.Run<int>(() =>
    {
        int sum = 0;
        for (int i = 0; i < 10; i++)
        {
            sum += i;
            Thread.Sleep(1000);
        }
        return sum;
    });
    int  count=0;
     while (!task.IsCompleted)
    {
        Console.WriteLine("等待异步任务:" + count + "秒");
        count++;
        Thread.Sleep(1000);
    }

    Console.WriteLine("任务完成,结果为" + task.Result);
static void Main(string[] args)
{
    //Method1();
    //Method2();
    var task = Get1To10();
    int count = 0;
    while (!task.IsCompleted)
    {
        Console.WriteLine("等待异步任务:" + count + "秒");
        count++;
        Thread.Sleep(1000);
    }
    Console.WriteLine("任务完成,结果为" + task.Result);
}

public static async Task<int> Get1To10()
{
    var taskResult = await Task<int>.Run<int>(() =>
    {
        int sum = 0;
        for (int i = 0; i < 10; i++)
        {
            sum += i;
            Thread.Sleep(1000);
        }
        return sum;
    });
    return taskResult;
}

这两段代码有什么区别,运行结果是两段代码都一样

如果可以用第一段代码完成任务,那么await又有什么用

回复
阅读 2.4k
2 个回答

可能你理解有误,并不需要用while等待结果的完成,看下面的例子, async和await就是一种语法糖 http://blog.jobbole.com/85787/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Threading;
using System.Threading.Tasks;
using System.Net;

namespace TestApp
{

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("开始获取博客园首页字符数量");
        Task<int> task1 = CountCharsAsync("http://www.cnblogs.com");
        Console.WriteLine("开始获取百度首页字符数量");
        Task<int> task2 = CountCharsAsync("http://www.baidu.com");

        Console.WriteLine("Main方法中做其他事情");

        Console.WriteLine("博客园:" + task1.Result);
        Console.WriteLine("百度:" + task2.Result);
    }

    static async Task<int> CountCharsAsync(string url)
    {
        WebClient wc = new WebClient();
        string result = await wc.DownloadStringTaskAsync(new Uri(url));
        return result.Length;
    }
}

}

ivony
  • 2
新手上路,请多包涵

异步的主要意义在于释放线程资源,避免线程阻塞。

所以async的使用场景有两个重要特征:
1、会阻塞。
2、可以干别的。

不会阻塞的场景使用异步是没有意义的(你的例子),而除了阻塞无事可做的场景使用异步也是没有意义的(还是你的例子)。

会阻塞的场景多见于IO,IO是最适合做异步的,典型的如文件读写,数据库操作,HTTP请求等等。所以微软在.NET Framework 4.5里面把所有IO操作全部提供了异步接口。

但是仅仅只是把IO改为异步操作,并不能带来性能提升,如果在异步操作的时候你的程序无所事事的话,这就是第二个关键。这个场景里不仅仅是会被阻塞,还需要在不阻塞的情况下,有别的事情可以做。

常见的就是并发。

譬如说我需要同时发起数十个HTTP请求,这时候HTTP请求是一个可能导致阻塞的IO操作,需要异步处理,同时,我在异步发起一个HTTP请求的同时,如果不被阻塞的话,我可以同时发起别的HTTP请求(并发),这时候async的意义就体现出来了。

public static async Task SendHttpRequest( string url )
{
  var client = new HttpClient();
  var response = await client.GetAsync( url );
  if ( response.Status != HttpStatus.OK )
    throw new Exception();
}

public static void Main()
{
  var tasks = new[]{ "http://163.com", "http://sina.com.cn" ... }.Select( url => SendHttpRequest( url ) );
  Task.WaitAll( tasks );
}
你知道吗?

宣传栏