与Implementing an interface that requires a Task return type in synchronous code类似,尽管我很好奇我是否应该忽略我的情况所产生的编译器错误。
假设我有一个这样的接口(interface):
public interface IAmAwesome {
Task MakeAwesomeAsync();
}
在某些实现中,可以通过使用
async
和await
异步完成而获得令人赞叹的 yield 。这确实是接口(interface)试图允许的。在其他情况下(可能很少见),只需一种简单的同步方法即可使其表现出色。因此,让我们假设实现看起来像这样:
public class SimplyAwesome : IAmAwesome {
public async Task MakeAwesomeAsync() {
// Some really awesome stuff here...
}
}
这可行,但是编译器警告:
编译器实际上是在建议这种解决方案:
public class SimplyAwesome : IAmAwesome {
public async Task MakeAwesomeAsync() {
await Task.Run(() => {
// Some really awesome stuff here, but on a BACKGROUND THREAD! WOW!
});
}
}
我的问题是-当我选择忽略此编译器警告时,应该确定什么?在某些情况下,工作是如此简单,以至于产生一个线程无疑会适得其反。
最佳答案
如果您确实确实想同步完成工作,那么您将知道async
方法将始终同步运行,在这种情况下这是理想的选择,那么请务必忽略该警告。如果您了解了警告所提示的内容,并且认为警告所描述的操作是正确的,那么这不是问题。毕竟这是一个警告,而不是一个错误。
当然,另一种选择是不使用async
方法,而只是使用Task.FromResult
来返回已经完成的任务。它将改变错误处理的语义(除非您还捕获所有异常并将它们包装到返回的任务中),因此至少要牢记这一点。如果您确实希望通过结果Task
传播异常,则可能值得离开async
方法,而只是取消警告。
关于c# - 返回Task的接口(interface)的同步实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28197902/