代码之家  ›  专栏  ›  技术社区  ›  Jimenemex

异步方法同步运行c#

  •  -3
  • Jimenemex  · 技术社区  · 6 年前

    我试图编写一个异步方法,以便在一组较大的日期之间为一组日期执行一些逻辑,但它不是异步运行的。我试着在这段时间里 startDate endDate ,但如果要计算的时间少于5天,则以5个或更少的块为单位。

    所以从 6-1-2018 6-29-2018 总共有5个块要进行逻辑操作。我试图同时为每个块触发一个异步方法。

    执行每个任务的总时间应该在5秒左右,因为任务只是休眠5秒。它目前正在运行30秒,这意味着它 异步,但同步。我如何修复它以便可以异步运行这些操作?

    public async static void Foo()
    {
        var watch = System.Diagnostics.Stopwatch.StartNew();
    
        List<Task> tasks = new List<Task>();
    
        DateTime endDate = new DateTime(2018, 6, 29);
        int dayIntervals = 4; // Query 5 days at a time
    
        for (DateTime startDate = new DateTime(2018, 6, 1); startDate.Date <= endDate.Date; startDate = startDate.AddDays(dayIntervals + 1))
        {
            dayIntervals = (startDate.AddDays(dayIntervals) > endDate ? dayIntervals = endDate.Day - startDate.Day : dayIntervals);
            tasks.Add(Action(startDate, startDate.AddDays(dayIntervals))); // Add the tasks
        }
    
        await Task.WhenAll(tasks); // Fire them asynchronously?
        watch.Stop();
        var elapsed = TimeSpan.FromMilliseconds(watch.ElapsedMilliseconds).TotalSeconds;
    
        Debug.WriteLine("Finished in: " + elapsed + " seconds"); // 30 sec
    }
    
    public static Task<DataTable> Action(DateTime one, DateTime two)
    {
        // Junk related to the table to be returned
        // ...
    
        Random r = new Random();
        Thread.Sleep(5000);
    
        return Task.FromResult(table);
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Kirk Larkin    6 年前

    你的 Action 方法不是异步的。不是的 await 什么都行。

    替换对的同步调用 Thread.Sleep 具有 await Task.Delay 是的。

    一旦你包括一个 等待 ,编译器将强制您将其声明为 异步 以下内容:

    public static async Task<DataTable> Action(DateTime one, DateTime two)