【发布时间】:2017-11-21 13:38:54
【问题描述】:
我有以下代码
var gamesList = new List<Game>();
gamesList.AddRange(await GetGamesSet(endpointFirst));
gamesList.AddRange(await GetGamesSet(endpointSecond));
我的GetGamesSet 方法是async 并返回List<Game>。它唯一要做的就是在给定端点查询 API,然后将 API 中的结果序列化为 List<Game> 对象。
我的GetGamesSet 方法的签名如下所示:
private async Task<List<Game>> GetGamesSet(string endpoint)
现在回答问题。对 games.AddRange() 的 2 次连续调用会发生什么。
1) 我会得到 2 个单独的线程,每个线程都将用于运行 GetGamesSet() 方法,并且在它们完成之后,我的列表将按顺序填充指定(意味着将添加endpointFirst的结果表单,然后添加endpoint 2的结果)
2) 我会获得 2 个单独的线程吗?游戏的最终顺序将取决于哪个线程完成得更快(这意味着如果它们碰巧加载得更快,我可以先从 secondEndpoint 获取游戏)
3) 或者我的两个假设都是错误的..我可以得到两个结果的混合。
PS:我什至会从我创建的两个等待中获得 2 个线程吗?
【问题讨论】:
-
跑起来试一试会发生什么?
-
不要假设;做
-
它们将按顺序执行,而不是并行执行。
-
API 目前正在开发中,目前,我从两个端点得到的结果基本相同,所以我无法真正确定顺序,因此我的问题 :)
-
"PS:我什至可以从我创建的两个等待中获得 2 个线程吗?"不,或者至少,不一定。可能绝对没有新线程。可能有一个。可能有 2 个。但重要的是你要明白“等待”并不意味着“创建一个新线程”。它的意思是“异步等待结果”——如何发生取决于你在等待什么。
标签: c# multithreading asynchronous thread-safety task