【问题标题】:async and await C# - Bug? [closed]异步和等待 C# - 错误? [关闭]
【发布时间】:2015-02-18 15:43:23
【问题描述】:

这两个sn-ps的代码完成时间不同,为什么?第一个需要 3000 毫秒,而第二个只需要 2000 毫秒。我正在运行 .Net framework 4.5 和 Visual Studio 2013 Ultimate。

static void Main(string[] args)
{
    var sw = new Stopwatch();
    sw.Start();            

    Task.Run(async () =>
    {
        var sw2 = new Stopwatch();
        sw2.Start();

        Task<int> t1 = GetList();
        Task<int> t2 = GetList2();

        var a = await t1;
        var b = await t2;

    }).Wait();

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds + " ms");
    Console.ReadKey();
}

第二次sn-p:

static void Main(string[] args)
{
    var sw = new Stopwatch();
    sw.Start();            

    Task.Run(async () =>
    {
        var sw2 = new Stopwatch();
        sw2.Start();

        var a = await GetList();
        var b = await GetList2();

    }).Wait();

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds + " ms");
    Console.ReadKey();
}

【问题讨论】:

  • 您能否详细解释一下您期望发生的情况、原因以及实际发生的情况?它几乎从来都不是框架中的错误,因此请期待您的期望或您的代码是错误的。
  • var a = await GetList();GetList 完成时等待。
  • 2000ms 的暂停是什么意思?这个停顿应该从哪里来?
  • 两个示例不应该导致 2000 毫秒的暂停 吗?嗯什么??这个神奇的数字是从哪里来的?
  • 我们没有 GetListGetList2 并没有帮助 - 听起来您可能只是看到了开始两个任务然后等待两个任务之间的区别(这意味着第二个在我们等待第一个时运行)与开始/等待,开始/等待,这意味着第二个任务只有在第一个任务完成之后才能开始

标签: c# asynchronous async-await


【解决方案1】:

不同之处在于下面的代码会启动两个异步操作然后开始等待。所以它们都并行执行,然后你等待第一个,一旦完成,你等待第二个。

Task<int> t1 = GetList();
Task<int> t2 = GetList2();

var a = await t1;
var b = await t2;

第二个例子只有在第一个动作完成后才开始第二个动作,所以完全没有重叠

var a = await GetList();
var b = await GetList2();

【讨论】:

    【解决方案2】:

    假设您要求执行时间差。 因为这将是同步调用

    var a = await GetList();
    var b = await GetList2();
    

    首先 GetList 完成,然后 GetList2 完成,因此存在执行时间差异。

    在以下情况下:

        Task<int> t1 = GetList();
        Task<int> t2 = GetList2();
    
        var a = await t1;
        var b = await t2;
    

    GetList 和 GetList2 将并行运行,然后您说要等待第一个,然后等待第二个。

    【讨论】:

    • 虽然你对第一个例子是正确的,但你对第二个例子的陈述并不完全正确。执行行为很大程度上取决于GetList() 的实现。如果没有导致提前返回的await 或类似语句,则仅当GetList() 完成时才会执行GetList2()。因此,GetList() 中第一个 await 之前的所有内容都不会同时运行。
    • 是的,你同意。需要更新我的答案。感谢您指出这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2020-01-03
    • 1970-01-01
    • 2012-12-15
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    相关资源
    最近更新 更多