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

时间:2012-06-13 00:58:48

标签: c# async-await

我想要一个像这样的方法:

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

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

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

这很有效。但这是作弊还是什么?

1 个答案:

答案 0 :(得分:4)

如果要使方法异步运行,通常会将其写为:

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

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

您当前的代码实际上并不会导致它以异步方式运行 - 它会导致该方法立即运行并返回,但随后会在您当前运行的同一上下文中安排DoSomethingElse()。这意味着,如果你在UI线程上调用你的方法,你将立即继续你以前的代码,而不是阻止UI 然后,但是当上下文执行{时仍然会阻止它{1}}致电。

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

Task DoSomethingElse()