提问者:小点点

不执行任何操作的异步方法


我有一个接口,它公开了一个方法。该方法应该启动动画并在完成时返回。

我想做的是实现一个动画类,它在执行时才返回。

这是正确的实现吗?

public async Task BeginAsync()
{
    await Task.Run(() => { });
}

我怀疑还有比这更优雅的做法。我还考虑过创建一个空方法。但这给了我一个我也不喜欢的警告。


共2个答案

匿名用户

只需使用返回已完成的任务:

public Task BeginAsync()
{
     return Task.CompletedTask;
}

如果您有/code>,请使用/code>返回已完成的任务和结果:

public Task<bool> BeginAsync()
{
     return Task.FromResult(true);
}

当前的实现效率非常低,因为它构建状态机,并且还使用线程池线程来运行空任务。

匿名用户

很容易陷入这样的陷阱:认为必须是任何异步方法签名的一部分。看来一定是这样;它(误导!)读起来就好像它的全部目的是将方法标记为异步。

但它不是,是必需的,而不是。这在@reedcopsey的回答和下面的例子中显示(略微改编自这个有用的SO回答):

public Task<int> MethodTaskAsync(int arg0, int arg1)
{
    Task<int> task = new Task<int>(() => Method(arg0, arg1));
    task.Start(); // Hot task (started task) should always be returned.
    return task;
}

这就是接口方法签名不需要,也不可能有关键字的原因:一个“asynchronous'方法本身,不管它如何实现,只是一个返回已启动(可能已经完成)的的方法。

如果没有将方法标记为异步,那么它会做什么?这是一种更简单地编写异步方法的方法:一旦您将它应用到一个方法中,您可以使用关键字来告诉编译器非常简单地正确地为您处理附属异步调用(如果没有它,您可以尝试手动处理附属

因此,如果您只想从一个“异步”(即

相关问题