由于将代码移植到Quartz 3.x,我试图修改C#.NET 4.6.1 Windows服务/控制台应用程序中的现有同步方法(可以以任何一种方式运行)以使其异步。修改了编码样式以使用异步方法。
我很困惑为什么在以下方法中出现错误:
private async Task ClearDynamicSchedules(int accountID)
{
log.Debug("Clearing existing schedules for account: " + accountID);
string group = "AccountID:" + accountID;
int count = 0;
var groupMatcher = GroupMatcher<JobKey>.GroupEquals(group);
var jobKeys = await this.Scheduler.Quartz.GetJobKeys(groupMatcher);
foreach (var jobKey in jobKeys)
{
var detail = this.Scheduler.Quartz.GetJobDetail(jobKey);
var triggers = await this.Scheduler.Quartz.GetTriggersOfJob(jobKey);
foreach (ITrigger trigger in triggers)
{
await this.Scheduler.Quartz.UnscheduleJob(trigger.Key);
count++;
}
}
log.Debug("Schedules cleared for account: " + accountID + ", load schedules should follow. " + count.ToString() + " schedules removed");
return System.Threading.Tasks.Task.FromResult<object>(null);
}
错误消息位于方法标题上,并显示:
异步方法的返回类型必须为空,任务或任务
我要返回任务,所以我很困惑为什么错误仍然出现。
答案 0 :(得分:3)
通常,您必须返回函数声明的所有内容。
Task<int> Bar()
{
return Task.FromResult(1);
}
但是当您在声明中添加async
时,编译器会为您添加Task的返回。
async Task Foo1()
{
//No return needed.
}
async Task<int> Foo2()
{
return 1; //Compiler converts the int to a Task<int> for you
}
因此在您的示例中,您的函数返回了自己的Task,这会干扰编译器要添加的任务。为了返回另一个任务,您必须像这样
async Task<Task<object>> Foo3()
{
return Task.FromResult<object>(null);
}
...这很奇怪,可能不是您想要的。
我认为在您的情况下,您只需要删除return
语句,它就可以按照您希望的方式工作。
private async Task ClearDynamicSchedules(int accountID)
{
log.Debug("Clearing existing schedules for account: " + accountID);
string group = "AccountID:" + accountID;
int count = 0;
var groupMatcher = GroupMatcher<JobKey>.GroupEquals(group);
var jobKeys = await this.Scheduler.Quartz.GetJobKeys(groupMatcher);
foreach (var jobKey in jobKeys)
{
var detail = this.Scheduler.Quartz.GetJobDetail(jobKey);
var triggers = await this.Scheduler.Quartz.GetTriggersOfJob(jobKey);
foreach (ITrigger trigger in triggers)
{
await this.Scheduler.Quartz.UnscheduleJob(trigger.Key);
count++;
}
}
log.Debug("Schedules cleared for account: " + accountID + ", load schedules should follow. " + count.ToString() + " schedules removed");
//No return
}
答案 1 :(得分:0)
您可以使用通用风味Task<T>
。另外,建议为该方法添加前缀Async的方法作为异步方法。有关此处的命名约定的更多信息:
Does the use of the "Async" suffix in a method name depend on whether the 'async' modifier is used?
由于您没有返回任何可能与调用方法相关的值,所以没有返回null的意义,就像您的方法总是返回null一样,无论逻辑是对还是错。