null
例如,如果我试图用On()和Off()方法实现一个
public interface ILight
{
void On();
void Off();
}
使用
public class WiredLight : ILight
{
private bool _powered;
public void On()
{
_powered = true;
}
public void Off()
{
_powered = false;
}
}
但是使用
public class WirelessLight : ILight
{
public async Task On()
{
await EnablePowerAsync();
}
public async Task Off()
{
await DisablePowerAsync();
}
}
阅读(这里和这里),这样做的方法只是强制接口中的异步签名,然后所有的同步调用将被重构为异步(ref:Async all the way)。这听起来不错,但我还没有真正了解应该如何处理同步方法(来自
public class WiredLight : ILight
{
public Task OnAsync()
{
_powered = true;
return Task.CompletedTask;
}
}
但是在同步运行时将方法表示为异步是错误的,而且也不利于重新协作。此外,看起来返回一个
在一个不返回任何东西,实际上应该是同步的方法上实现一个异步接口,有没有一个公认的实践?
从同步方法中执行异步操作可能非常危险。没有完美的方法可以做到这一点,而且您可能经常会陷入线程不足问题的僵局。这不是你想要的情况。
另一方面,从异步方法执行同步操作是安全的。当然,您在对调用者撒谎,但这并不是真正的问题,除非他希望并行执行您的代码(在这种情况下,一旦他注意到这个问题,他只需添加一个
因此,如果您有理由认为需要在接口的某个实现中执行异步代码,请不要犹豫,将其标记为异步代码。对于实际上是同步的实现,返回一个已完成的任务通常是最好的做法:
public Task DoSomethingAsync()
{
DoSomething();
return Task.CompletedTask;
}
我建议不要在方法内部使用