【发布时间】:2015-11-09 22:11:29
【问题描述】:
我有以下方法:
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);
这将只是无操作并立即退出。我也试过:
Task.Run(() => { CreateSchedule(allDates); }).Wait();
这也是一样的。
看来我必须让CreateSchedule 返回一个Task<T> 或要等待的任务枚举。这里的正确方法是什么?
【问题讨论】:
-
不要使用 async void,它们适用于事件处理程序。返回一个任务并一直等待它。
-
您不应使用
async void而应使用async Task。您还应该awaiting 调用该函数以使其异步。 -
啊完美!如果异步方法中没有
return语句,我没有意识到方法只会隐式返回一个 Task 。另外,@RonBeyer - 我不能await调用CreateSchedule,因为这是在单元测试中调用的,而单元测试不支持async。但是,我可以在CreateSchedule()通话中使用.Wait()。你们中的一个,请随意写一个答案,我会投票/接受。 -
@MikeChristensen 您使用的是哪个版本的 Visual Studio? VS2012 增加了
async/await单元测试支持。许多测试框架都支持异步测试。 -
@RonBeyer - VS2013。当我尝试将测试标记为异步并运行测试时,它只是显示“失败”(没有错误代码、抛出异常、输出中的任何内容等)。需要注意的一点是,我在
[TestInitialize]方法中调用此异步方法,而不是[TestMethod]- 不确定这是否有区别..
标签: c# .net async-await