我有以下代码
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()
方法并且 AFTER 完成后,我的列表将填入指定的顺序(意味着将添加结果形式endpointFirst,然后添加端点2的结果)
2)我是否会得到2个单独的线程,游戏的最终排序将取决于哪个线程更快完成(这意味着如果碰巧加载得更快,我可以先从secondEndpoint获取游戏)
3)或许我的两个假设都是错误的......我可以混合两种结果。
PS:我是否从我创建的两个等待中获得2个线程?
答案 0 :(得分:1)
我假设您正在使用上面的代码段:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos);
ZipEntry ze = new ZipEntry(“Temp.txt”);
zos.putNextEntry(ze);
FileInputStream fis = new FileInputStream("Test/File1.txt");
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
//System.out.println(new String(buffer));
zos.write(buffer, 0, len);
}
在第一次调用private void Start()
{
// blocks an execution here waiting for FillList() to finish
FillList().Wait();
}
private async void FillList()
{
var gamesList = new List<string>();
gamesList.AddRange(await GetGamesSet());
gamesList.AddRange(await GetGamesSet());
/* more stuff */
}
private async Task<List<string>> GetGamesSet()
{
await Task.Delay(200);
return new List<string> { "result1", "result 2" };
}
时,FillList()将退出调用者Start()并阻止在Wait()方法上执行。
同时AddRange
将异步运行,最终将成功返回数据集。
接下来,控件将返回到下一个await GetGamesSet()
,并将以与第一次调用相同的方式异步等待结果。
当FillList完成执行时,AddRange
将返回。
结果的排序很明显,因为该程序在等待被调用的函数时跳过了Start()
方法的代码,立即将它退出给调用者。