我想要一个像这样的方法:
public async void DoSomething()
{
DoSomethingElse();
}
但是因为没有AWAIT我得到一个警告,它会同步运行。那不是我的意图。我的意图是运行异步。所以,我这样做:
public async void DoSomething()
{
await Task.Delay(0);
DoSomethingElse();
}
这很有效。但这是作弊还是什么?
答案 0 :(得分:4)
如果要使方法异步运行,通常会将其写为:
public Task DoSomething()
{
return Task.Factory.StartNew( () => DoSomethingElse());
}
这将导致TPL安排您的方法运行(在后台线程上),并允许调用者在调用您的方法时使用await
,如果他们需要使用async / await支持。
您当前的代码实际上并不会导致它以异步方式运行 - 它会导致该方法立即运行并返回,但随后会在您当前运行的同一上下文中安排DoSomethingElse()
。这意味着,如果你在UI线程上调用你的方法,你将立即继续你以前的代码,而不是阻止UI 然后,但是当上下文执行{时仍然会阻止它{1}}致电。
当然,这是假设DoSomethingElse()
本身不是异步方法。如果它被定义为DoSomethingElse()
,你可以写:
Task DoSomethingElse()