c# - 如何防止 UI 线程进入 WPF MVVM 应用程序中的模型?
问题描述
我想在我的应用程序架构中建立一个规则,即模型对象中的任何代码都不应在 UI 线程上执行。问题是,我该如何执行?
在使用 async/await 的 C# 中,执行某事的线程通常由调用者决定。因此,如果用户单击按钮,事件处理程序将在 UI 线程上运行,并调用我的视图模型。在视图模型中,我希望开发人员执行类似调用的操作Task.Run()
在模型上调用方法时。但这很容易忘记。还有一些不明显的漏洞,例如引发已连接到作为模型对象的侦听器的事件。理想情况下,当开发人员犯这种编程错误时,只要 UI 线程尝试在模型上执行该方法,就会抛出异常。我真正想要的是一种标记包含模型类的程序集的方法,这种方法会导致其中的任何方法在 UI 线程进入时立即引发异常。我能想到的最接近的方法是在每个方法的开头添加一个调试断言来检查线程,如果它是 UI 线程则失败。但是,这会在代码中添加丑陋的检查,并且是另一件可以被遗忘的事情。
编辑:澄清一下,我不需要让它变得不可能。我只需要让正确地做起来很容易,并确定什么时候做的不正确。把它投入成功的深渊。
解决方案
问题是,我该如何执行?
你不。没有办法通过简单的语言规则来强制执行关注点的逻辑分离。
最好的方法是为此编写一个分析器,在 Visual Studio 中显示警告。但是...玩得开心,我认为这是一项过于复杂的任务,不值得花时间。
推荐阅读
- python - 是否可以同时运行两个函数?
- opengl - 我怎样才能简单地将 GLSL 编译为 SPIR-V?
- r - glmnet 的默认变量跟踪图是否使用标准化系数?
- asp.net - 在没有在 asp.net 核心中编辑代码的情况下在视图页面中编辑时我应该发布什么
- django - 如何用pytest测试保存Django模型的方法?
- c - 如何在 if 语句中打破嵌套 for 循环并在满足其他 If 条件时切换到另一个语句?
- dart - 如何在扩展方法中使用运算符?
- c# - 如何使用 C# 将模式匹配的 XML 元素序列化为列表
- excel - excel中函数输入的总和
- azure - Azure Data Lake Storage (ADLS Gen2) 中的 java.lang.NoSuchMethodError: reactor.core.publisher.Flux.toIterable(I)Ljava/lang/Iterable"