我正在尝试编写一个异步方法,以仅对较大日期集之间的一组日期执行一些逻辑,但它没有异步运行。我正在尝试对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);
}
答案 0 :(得分:1)
您的Action
方法不是异步的。它什么都没await
。
用Thread.Sleep
替换对await Task.Delay
的同步调用。
一旦包含await
,编译器将强制您将其声明为异步:
public static async Task<DataTable> Action(DateTime one, DateTime two)