【问题标题】:Using await inide List.AddRange C#使用 await inide List.AddRange C#
【发布时间】:2017-11-21 13:38:54
【问题描述】:

我有以下代码

        var gamesList = new List<Game>();
        gamesList.AddRange(await GetGamesSet(endpointFirst));
        gamesList.AddRange(await GetGamesSet(endpointSecond));

我的GetGamesSet 方法是async 并返回List&lt;Game&gt;。它唯一要做的就是在给定端点查询 API,然后将 API 中的结果序列化为 List&lt;Game&gt; 对象。

我的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


【解决方案1】:

我假设你正在像这样使用上面的 sn-p:

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" };
}

在第一次调用AddRange 时,FillList() 将退出到调用方 Start() 并阻止 Wait() 方法的执行。

与此同时,await GetGamesSet() 将异步运行,最终将成功返回一组数据。

接下来,控制权将返回到下一个AddRange,并以与第一次调用相同的方式异步等待结果。

FillList 执行完成后,Start() 将返回。

结果的顺序很明显,程序在等待被调用函数时会跳过async方法的代码,立即将其退出给调用者。

【讨论】:

  • 太棒了,感谢您的出色回答。还有一个问题 - 如果我在 Start 方法中没有 .Wait() 调用,Start() 会继续执行直到 AddRange() 完成吗?
  • 编译器会就此发出警告。您可以使用Start() 代替Wait(),但您不知道任务何时结束。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
相关资源
最近更新 更多