如同在同步代码中实现需要 Task 返回类型的接口 https://stackoverflow.com/questions/26352034/implementing-an-interface-that-requires-a-task-return-type-in-synchronous-code尽管我很好奇我是否应该忽略我的情况生成的编译器错误。
假设我有一个这样的界面:
public interface IAmAwesome {
Task MakeAwesomeAsync();
}
在某些实现中,使用异步完成可以带来巨大的好处async
and await
。这确实是界面试图允许的。
在其他情况下,也许很少见,只需要一个简单的同步方法就可以变得很棒。因此,我们假设实现如下所示:
public class SimplyAwesome : IAmAwesome {
public async Task MakeAwesomeAsync() {
// Some really awesome stuff here...
}
}
这可行,但编译器警告:
该方法缺少“await”运算符,并且将同步运行。
考虑使用await
等待非阻塞 API 调用的运算符,
或“await TaskEx.Run(...)”在后台执行 CPU 密集型工作
线。
编译器实际上建议这个解决方案:
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
并只是抑制警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)