【问题标题】:Odd definition of method with "async" and return type nongeneric "Task"?具有“异步”和返回类型非泛型“任务”的方法的奇怪定义?
【发布时间】:2017-05-31 19:01:58
【问题描述】:

如下定义的方法不能返回任何内容。那么如何搭配 进入这种方法必须返回“任务”的正常语法。 因此,当“async”被移除时,下面的方法将无法编译。

static async Task MyAsyncMethod() { }

当你调用方法时:

await MyAsyncMethod();

"await" 应该在可等待对象上调用,但这里返回 类型是“struct Void”,这是不可等待的

【问题讨论】:

  • 如果 async 被移除,如果你实际返回一个任务,它将编译。并不是说我建议在大多数情况下这样做。无论如何,你的实际问题是什么?我在您的标题中看到一个问号,但不是实际问题。只是一个观察。
  • 您返回一个Task,因为这是运行时可以确定异步操作何时完成的方式。如果你简单地将它标记为void,虽然它会编译,但它会被视为“一劳永逸”,在执行一些其他逻辑之前,你无法等待该任务完成。 Fire and forget 语义保留给事件处理程序(例如按钮点击)。
  • 重点是语法一致性。当语法说返回“任务”但实际上它取决于其他修饰符时,我们需要解释它
  • 您的实际问题是什么?
  • async 不符合正常语法,它将返回值提升为 Task<T> 用于返回值的方法,或 Task 用于 void 方法。 async 方法也可以返回 void 在这种情况下创建的 Task 不会返回给调用者并且无法观察到。

标签: c#


【解决方案1】:

你可以

public async Task DoAsync()
{
    // do anything synchron here
    // await other Task
}

public Task DoAsync()
{
    // do anything synchron here
    return Task.CompletedTask;
}

public Task DoAsync()
{
    // do anything synchron here
    return Task.FromResult( false );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多