c# - 使用 async/await 是否比使用 task.Start() 更好,为什么?

标签 c# task async-await

比较下面两种方法:

static async Task<int> DownloadAsync(string url)
{
    var client = new WebClient();
    var awaitable = client.DownloadDataTaskAsync(url);
    byte[] data = await awaitable;
    return data.Length;
}

用法:Task<int> task = DownloadAsync("http://stackoverflow.com");

static Task<int> Download(string url)
{
    var client = new WebClient();
    var task = client.DownloadDataTaskAsync(url);
    byte[] data = task.Result;
    return Task.FromResult(data.Length);
}

用法:

Task task = new Task(() => Download("http://stackoverflow.com"));
task.Start();

据我所知,这两种方法都是异步运行的。我的问题是:
这两种方法在行为上有什么不同吗?
为什么我们更喜欢 async-await 而不是它是一个很好的模式?

最佳答案

你发的两种方法完全不一样

DownloadAsync 是一种真正的异步方法。这意味着在下载数据时,没有线程阻塞在该异步操作上。

Download 通过调用 Task.Result 同步阻塞调用线程。我在我的博客上解释why Result should not be used with asynchronous Tasks : 在一般情况下,它会导致死锁。但让我们假设没有死锁。然后您从 TPL 任务调用它,因此它会阻塞任务线程(很可能是线程池线程)。在下载数据时,该任务线程在该异步操作上被阻塞。

因此,DownloadAsync 效率更高。

关于c# - 使用 async/await 是否比使用 task.Start() 更好,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025858/

相关文章:

c# - 在代理后面连接到 Azure Batch - 操作返回无效状态代码 'Forbidden'

c# - 如何将 rtf 或 docx 转换为 PDF 服务器端(不光栅化或替换 OpenType 字体)

c# - 通过反射调用带有参数的泛型方法时,无法将 System.Int32 类型的对象转换为 System.Object[]

c# - Thread.Join 与 Task.Wait

c# - 以异步方式调用同步方法?

c# - ASP.NET MVC 中的动态路由操作名称

java - Java 静态 Timer 可以处理多个调用 cancel() 的 TimerTasks 吗?

multithreading - Streamwriter、StringBuilder 和并行循环

async-await - AIOHTTP:TypeError: index() 采用 0 个位置参数,但给出了 1 个

JavaScript 异步/等待 : await is a reserved word