我想要这样的方法:
public async void DoSomething()
{
DoSomethingElse();
}
但是因为没有 AWAIT 我得到一个警告,它会同步运行。那不是我的意图。我的意图是异步运行。所以,我这样做:
public async void DoSomething()
{
await Task.Delay(0);
DoSomethingElse();
}
这行得通。但这是作弊还是什么?
我想要这样的方法:
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
}