使用等待List.AddRange C#

时间:2017-11-21 13:38:54

标签: c# multithreading asynchronous thread-safety task

我有以下代码

        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个线程?

1 个答案:

答案 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()方法的代码,立即将它退出给调用者。