C#异步/等待问题-获得“即使我确实返回了任务,异步方法的返回类型也必须为空,任务或任务<T>

时间:2019-12-20 04:02:40

标签: c# asynchronous

由于将代码移植到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);
}

错误消息位于方法标题上,并显示:

  

异步方法的返回类型必须为空,任务或任务

我要返回任务,所以我很困惑为什么错误仍然出现。

2 个答案:

答案 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一样,无论逻辑是对还是错。