在编写异步方法时,使用 ConfigureAwait(false) 避免使用者死锁
我在 使用 Task.Wait()?立刻死锁(deadlock) 一文中站在类库使用者的角度看 async
/await
代码的死锁问题;而本文将站在类库设计者的角度来看死锁问题。
阅读本文,我们将知道如何编写类库代码,来尽可能避免类库使用者出现那篇博客中描述的死锁问题。
将 async/await 异步代码转换为安全的不会死锁的同步代码(使用 PushFrame)
在 async
/await
异步模型(即 TAP Task-based Asynchronous Pattern)出现以前,有大量的同步代码存在于代码库中,以至于这些代码全部迁移到 async
/await
可能有些困难。这里就免不了将一部分异步代码修改为同步代码。然而传统的迁移方式存在或多或少的问题。本文将总结这些传统方法的坑,并推出一款异步转同步的新方法,解决传统方法的这些坑。
UI 设计中的视觉无障碍设计(色盲眼中的世界以及 UI 使用体验)
我给博客改了主题色,从 这样的 改成了 这样的;然而我问小伙伴看看效果他却并没有发现改变。
红绿色盲在亚洲人中占比,男性约 5%,女性则小得多。也就是说,就算仅考虑为国内用户开发应用,这也是很大的一部分用户了。
本文将通过更加了解色盲(Color Blindness)来指导我们为更多用户提供更好的 UI 设计。
C#/.NET 中的契约式编程,以及 ReSharper 为我们提供的契约特性
将文档放到代码里面,文档才会及时地更新!
微软从 .NET Framework 4.0 开始,增加了 System.Diagnostics.Contracts
命名空间,用来把契约文档融入代码。然而后面一直不冷不热,Visual Studio 都没天然支持。
ReSharper 也提供了 ReSharper Annotations,在 ReSharper 插件工作的情况下能够进行静态契约的验证。
C#8.0 的可空引用类型是 Roslyn 对 null 的验证,这个可能更加强大,既可以是编译警告,也可以是编译错误。