将功能标记为异步但没有等待调用,有什么问题吗?

Roc*_*lan 3 c# async-await

标记为异步的功能是否有任何副作用,但实际上并未进行任何等待调用?例如:

public interface IMyInterface
{
    Task DoSomethingAsync();
}

public class DoSomething1:IMyInterface
{
    public async Task DoSomethingAsync()
    {
        await getSomethingFromDatabaseAsync();
    }
}

public class DoSomething2:IMyInterface
{
    public async Task DoSomethingAsync()
    {
        doSomethingElse();
    }
}
Run Code Online (Sandbox Code Playgroud)

IMyInterface由许多类实现,但是对于其中一个类,没有等待调用。这会引起任何问题吗?

AAA*_*ddd 7

如果您有一个返回任务的接口方法并且没有等待(是的,它发生了)。只需删除async关键字并返回Task.CompletedTask

Task.CompletedTask属性返回其Status属性设置为的任务RanToCompletion

获取已成功完成的任务。

public class DoSomething2:IMyInterface
{
    public Task DoSomethingAsync()
    {
        doSomethingElse();
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

是的,有副作用,编译器正在检查IAsyncStateMachine并产生更多的IL,此外,将来的开发人员将用ire查看您的代码。至于其他功能上的区别,我想不到任何方便的地方。