2

我想要这样的方法:

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

但是因为没有 AWAIT 我得到一个警告,它会同步运行。那不是我的意图。我的意图是异步运行。所以,我这样做:

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

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

4

1 回答 1

4

如果你想让方法异步运行,你通常会这样写:

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
}
于 2012-06-13T01:01:45.880 回答