异步方法同步运行C#

时间:2018-06-29 15:42:11

标签: c# asynchronous async-await

我正在尝试编写一个异步方法,以仅对较大日期集之间的一组日期执行一些逻辑,但它没有异步运行。我正在尝试对startDateendDate之间的日期进行逻辑运算,但是如果要计算的天数少于5天,则以5或更少的块为单位。

因此,从6-1-20186-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 个答案:

答案 0 :(得分:1)

您的Action方法不是异步的。它什么都没await

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

一旦包含await,编译器将强制您将其声明为异步

public static async Task<DataTable> Action(DateTime one, DateTime two)
相关问题