如何创建一个异步调用一堆方法的方法

时间:2015-11-09 22:11:30

标签: c# .net async-await

我有以下方法:

private async void CreateSchedule(IEnumerable<DateTime> dates)
{
   using (var db = new SolverDbContext())
   {
      foreach (var date in dates)
      {
         var job = await client.ConfigureJob(new JobConfigurationModel
         {
            ScheduleDate = date.ToString("yyyy-MM-dd"),
            // Bunch of other stuff that doesn't matter
         });

         var dbSchedule = Schedule.Default;
         dbSchedule.Ticket = job;
         dbSchedule.ScheduleDate = date;
         db.Schedule.Add(dbSchedule);
      }

      db.SaveChanges();
   }
}

基本上它遍历一堆日期并调用一个名为ConfigureJob的等待方法(它对Web服务进行HTTP调用)。

现在,我想调用此方法。我试过了:

CreateSchedule(allDates);

这只是no-op并立即退出。我也试过了:

Task.Run(() => { CreateSchedule(allDates); }).Wait();

这也是一样。

似乎我必须让CreateSchedule返回Task<T>或枚举的任务等待。这里有什么正确的方法?

1 个答案:

答案 0 :(得分:1)

不要使用async void,用于事件处理程序。相反,你应该返回一个任务。

private async Task CreateSchedule(IEnumerable<DateTime> dates)
{
   // The rest of your code can remain the same.
}

然后在您的消费代码中,您应该一直使用异步语义,因此您应该在返回Task的方法中等待结果:

[TestMethod]
public async Task TestScheduler()
{
    // .. Maybe some prep work here ..
    await CreateSchedule(allDates);
    // .. Do Some Assert Checks Here ..
}