这是使方法异步的错误方法吗?

本文关键字:方法 错误 异步 | 更新日期: 2023-09-27 18:37:10

我想要这样的方法:

public async void DoSomething()
{
    DoSomethingElse();
}

但是由于没有 AWAIT,我收到一条警告,指出它将同步运行。这不是我的本意。我的目的是异步运行。所以,我这样做:

public async void DoSomething()
{
    await Task.Delay(0);
    DoSomethingElse();
}

这行得通。但这是作弊还是什么?

这是使方法异步的错误方法吗?

如果要使方法异步运行,通常可以这样编写:

public Task DoSomething()
{
    return Task.Factory.StartNew( () => DoSomethingElse());
}

这将导致 TPL 计划您的方法运行(在后台线程上),并允许调用方在调用您的方法时使用await(如果他们需要使用 async/await 支持)。

当前代码实际上并不会导致异步运行 - 它会导致方法运行并立即返回,但随后计划在当前运行的同一同步上下文上发生DoSomethingElse()。 这意味着,如果在 UI 线程上调用方法,将立即继续以前的代码,并且不会立即阻止 UI,但稍后在上下文执行DoSomethingElse()调用时仍会阻止它。

当然,这是假设DoSomethingElse()本身不是异步方法。 如果它被定义为 Task DoSomethingElse() ,你可以写:

public async Task DoSomething()
{
    // other code as needed
    await DoSomethingElse();
    // other code as needed
}