这是使方法异步的错误方法吗?
本文关键字:方法 错误 异步 | 更新日期: 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
}