我尝试实现静态分析,以检查方法及其调用图是否需要UI或Request(ASP.NET)上下文。答案将决定方法体中await语句中对ConfigureAwait的需求。
我的计划是使用Roslyn检查调用图中每个成员访问的符号,无论它们是从System.Windows.UIElement类派生的。这种方法有效吗?那么ASP.NET上下文呢?
答案 0 :(得分:4)
这种静态分析很难正确实施。您可以使用启发式方法(例如UIElement
),但您可能最终会出现一些误报和/或漏报。
例如,FlowDocument
并非来自UIElement
。您可以更改您的启发式以测试DispatcherObject
- 派生类型,但之后还包括Freezable
,它可能需要或可能不需要上下文 - 您无法在编译时知道。因此,在一般情况下保证误报(或否定)。
作为另一个示例,将项目添加到作为数据绑定属性公开的集合中也需要上下文,即使该集合不是UI元素。
ASP.NET中存在类似的问题。 HttpContext.Current
很明显,但是隐式使用当前文化的字符串格式化方法呢?有很多"陷阱"在ASP.NET方面也是如此。
那就是说,我认为这是一个好主意;只要确保有一个简单的方法来忽略误报和漏报。
答案 1 :(得分:1)
我认为比较字符串的出现次数' await'和字符串' ConfigureAwait'在同一个文件中。
这可能是天真的,但却是第一道防线。