美文网首页
异步编程(八):async/await模式之异步等待

异步编程(八):async/await模式之异步等待

作者: 曦航老袁 | 来源:发表于2019-02-24 22:15 被阅读0次

在async/await模式的异步方法中,有时你也会希望用await表达式来等待Task。这时异步方法会返回到调用方法,但该异步方法会等待一个或所有任务完成。你可以通过Task.WhenAll 或 Task.WhenAny方法来实现。这两个方法又被称为组合子(combination)
下面的代码展示了一个使用Task.WhenAll方法的示例。它异步地等待所有与之相关的Task完成,不会占用主线程的时间。

public class MyDownLoadString
{
    Stopwatch sw = new Stopwatch();
    public void DoRun()
    {
        Task<int> t = CountCharactersAsync(2, "http://www.microsoft.com","http://www.baidu.com");

        Console.WriteLine("DoRun: Task {0} Finished", t.IsCompleted ? string.Empty : "Not");
        Console.WriteLine("DoRun: Result = {0}", t.Result);
    }

    private async Task<int> CountCharactersAsync(string site1, string site2)
    {
        var wc1 = new WebClient();
        var wc2 = new WebClient();
        var t1 = wc1.DownloadStringTaskAsync(new Uri(site1));
        var t2 = wc2.DownloadStringTaskAsync(new Uri(site2));

        List<Task<string>> tasks = new List<Task<string>>() { t1, t2 };
        await Task.WhenAll(tasks);
        Console.WriteLine("     CCA: T1 {0} Finished", t1.IsCompleted ? string.Empty : "Not ");
        Console.WriteLine("     CCA: T2 {0} Finished", t2.IsCompleted ? string.Empty : "Not ");
        return t1.IsCompleted ? t1.Result.Length : t2.Result.Length;
    }
}
class Program
{
    static void Main()
    {
        MyDownLoadString ds = new MyDownLoadString();
        ds.DoRun();
    }
}

同理,Task.WhenAny组合子会异步地等待与之相关的某个Task完成。

相关文章

网友评论

      本文标题:异步编程(八):async/await模式之异步等待

      本文链接:https://www.haomeiwen.com/subject/ojhiyqtx.html