ConfigureAwait 的静态分析
Static Analysis for ConfigureAwait
我尝试实施静态分析以检查该方法及其调用图是否完全需要 UI 或 Request (ASP.NET) 上下文。答案将决定是否需要在方法主体的 await 语句中使用 ConfigureAwait。
我的计划是使用 Roslyn 检查调用图中每个成员访问的符号是否来自 System.Windows.UIElement class。这种方法行得通吗? ASP.NET 上下文呢?
任何此类静态分析都很难正确实施。您可以使用启发式方法(例如,UIElement
),但最终可能会出现一些误报 and/or 漏报。
例如,FlowDocument
不派生自 UIElement
。您可以更改您的启发式以测试 DispatcherObject
派生类型,但那也将包括 Freezable
,这可能需要也可能不需要上下文——您不能总是在编译时知道。因此,在一般情况下,这是有保证的误报(或否定)。
作为另一个示例,向作为数据绑定 属性 公开的集合添加项目也需要上下文,即使该集合不是 UI 元素。
ASP.NET 中存在类似的问题。 HttpContext.Current
很明显,但是隐式使用当前区域性的字符串格式化方法呢? ASP.NET 侧也有一些 "gotchas"。
也就是说,我确实认为这是个好主意;一定要有一种简单的方法来忽略误报和漏报。
我认为比较字符串 'await' 和字符串 'ConfigureAwait' 在同一个文件中出现的次数很简单。
这可能是天真的,但是第一道防线。
我尝试实施静态分析以检查该方法及其调用图是否完全需要 UI 或 Request (ASP.NET) 上下文。答案将决定是否需要在方法主体的 await 语句中使用 ConfigureAwait。
我的计划是使用 Roslyn 检查调用图中每个成员访问的符号是否来自 System.Windows.UIElement class。这种方法行得通吗? ASP.NET 上下文呢?
任何此类静态分析都很难正确实施。您可以使用启发式方法(例如,UIElement
),但最终可能会出现一些误报 and/or 漏报。
例如,FlowDocument
不派生自 UIElement
。您可以更改您的启发式以测试 DispatcherObject
派生类型,但那也将包括 Freezable
,这可能需要也可能不需要上下文——您不能总是在编译时知道。因此,在一般情况下,这是有保证的误报(或否定)。
作为另一个示例,向作为数据绑定 属性 公开的集合添加项目也需要上下文,即使该集合不是 UI 元素。
ASP.NET 中存在类似的问题。 HttpContext.Current
很明显,但是隐式使用当前区域性的字符串格式化方法呢? ASP.NET 侧也有一些 "gotchas"。
也就是说,我确实认为这是个好主意;一定要有一种简单的方法来忽略误报和漏报。
我认为比较字符串 'await' 和字符串 'ConfigureAwait' 在同一个文件中出现的次数很简单。
这可能是天真的,但是第一道防线。