摘要: 我在之前的博客中有教大家如何编写 NuGet 工具包,其中就有编写 .targets 文件。 我在实际的使用中,发现 Visual Studio 2017 带来的含 Sdk 的新 csproj 格式基本上没有多少坑;然而旧的 csproj 文件却总是不能完美的运行,总是出错。关键是,不是每台电脑都出 阅读全文
posted @ 2018-12-23 15:17 walterlv 阅读(402) 评论(0) 推荐(0) 编辑
摘要: 我们已经知道 Task 是可等待的,但是去看看 Task 类的实现,几乎找不到哪个基类、接口或者方法属性能够告诉我们与 await 相关。 而本文将探索什么样的类是可使用 await 异步等待的? Dixin’s Blog - Understanding C# async / await (2) T 阅读全文
posted @ 2018-12-23 15:16 walterlv 阅读(552) 评论(0) 推荐(0) 编辑
摘要: .NET 中的 async / await 写异步代码用起来真的很爽,就像写同步一样。我们可以在各种各样的异步代码中看到 Task 返回值,这样大家便可以使用 await 等待这个方法。不过,有时需要写一些特别的异步方法,这时需要自己来实现一个可以异步等待的对象。 本文将讲述如何实现一个可等待对象, 阅读全文
posted @ 2018-12-23 15:13 walterlv 阅读(402) 评论(0) 推荐(0) 编辑
摘要: 我在几篇文章中都说到了在 .NET 中自己实现 Awaiter 情况。async / await 写异步代码用起来真的很爽,就像写同步一样。然而实现 Awaiter 没有现成的接口,它需要你按照编译器的要求为你的类型添加一些具有特定名称的属性和方法。然而没有接口的帮助,我们编写起来就很难获得工具(如 阅读全文
posted @ 2018-12-23 15:11 walterlv 阅读(368) 评论(0) 推荐(0) 编辑
摘要: WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型。其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程。 然而,如果你在 Lazy 上下文中使用了 Invoke,那么当这个 Lazy<T> 跨线程并发时,极有可能导致死锁。本文将具体说说这个例子。 阅读全文
posted @ 2018-12-23 14:59 walterlv 阅读(2347) 评论(0) 推荐(1) 编辑
摘要: AutoResetEvent、ManualResetEvent、Monitor、lock 等等这些用来做同步的类,如果在异步上下文(await)中使用,需要非常谨慎。 本文将说一个在同步上下文中非常常见的一种用法,换成异步上下文中会产生死锁的问题。 本文内容 一段正常的同步上下文的代码 一个微调即会 阅读全文
posted @ 2018-12-23 14:58 walterlv 阅读(656) 评论(0) 推荐(0) 编辑
摘要: 一个简单的 Task 不会消耗多少时间,但如果你不合适地将 Task 转为同步等待,那么也可能很快耗尽线程池的所有资源,出现类似死锁的情况。 本文将以一个最简单的例子说明如何出现以及避免这样的问题。 本文内容 耗时的 Task.Run 最简复现代码 原因 解决 更多死锁问题 本文内容 耗时的 Tas 阅读全文
posted @ 2018-12-23 14:57 walterlv 阅读(673) 评论(0) 推荐(0) 编辑
摘要: .NET Framework 4.5 开始引入 Task.Run,它可以很方便的帮助我们使用 async / await 语法,同时还使用线程池来帮助我们管理线程。以至于我们编写异步代码可以像编写同步代码一样方便。 不过,如果滥用,也可能导致应用的性能急剧下降。本文将说明在默认线程池配置(Threa 阅读全文
posted @ 2018-12-23 14:56 walterlv 阅读(1939) 评论(0) 推荐(0) 编辑