我有以下方法:
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>
或枚举的任务等待。这里有什么正确的方法?
答案 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 ..
}