walterlv的专栏

欢迎访问 https://walterlv.com/ 热爱设计,不止是程序,更是艺术!

在 Roslyn 分析语法树时添加条件编译符号的支持

我们在代码中会写 #if DEBUG 或者 [Conditional("DEBUG")] 来使用已经定义好的条件编译符号。而定义条件编译符号可以在代码中使用 #define WALTERLV 来实现,也可以通过在项目属性中设置条件编译符号(Conditional...

2019-01-01 11:01:04

阅读数:48

评论数:0

.NET/C# 项目如何优雅地设置条件编译符号?

条件编译符号指的是 Conditional Compilation Symbols。你可以在 Visual Studio 的项目属性中设置,也可以直接在项目文件中写入 DefineConstants 属性。 不过对于不同种类的项目,我建议使用不同的设置方法。本文将介绍如何设置条件编译符。 对于新...

2019-01-01 11:00:22

阅读数:111

评论数:0

在 Windows 10 中开启移动 WLAN 热点

本文将介绍如何在 Windows 10 中开启移动 Wi-Fi 热点。 This post is written in multiple languages. Please select yours: 在 Windows 10 中开启移动 WLAN 热点 - walterlv Turn on ...

2019-01-01 10:59:25

阅读数:41

评论数:0

.NET 编写一个可以异步等待循环中任何一个部分的 Awaiter

林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试。然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误。 这似乎是一个矛盾的要求。然而最终我想到了一个办法:让重试一直进行下去,谁需要关心异常谁就去 catch 异常,不需要关心异常的模块则跟着一直重试直到成功。 我们...

2019-01-01 10:57:58

阅读数:249

评论数:0

使用 WPF 开发一个 Windows 屏幕保护程序

最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面。我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的。 本文将介绍如何为 Windows 这一悠久的功能进行开发。 本文内容屏幕保护程序的本质安装屏幕保护程序处理屏幕保护程序参数请预防...

2019-01-01 10:56:43

阅读数:1379

评论数:2

.NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件

你可以使用临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphores)和事件(Event)来处理线程同步。然而,在编写一些异步处理函数,尤其是还有 async 和 await 使用的时候,还有一些更方便的类型可以用来处理线程同步。 使用 TaskCompleti...

2019-01-01 10:55:45

阅读数:28

评论数:0

C#/.NET 使用 CommandLineParser 来标准化地解析命令行

CommandLineParser 是一款用于解析命令行参数的 NuGet 包。你只需要关注你的业务,而命令行解析只需要极少量的配置代码。 本文将介绍如何使用 CommandLineParser 高效写出自己程序的命令行解析部分。 本文内容NuGet 包和 GitHub 开源仓库最简单的命令行解...

2019-01-01 10:54:46

阅读数:29

评论数:0

文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了

当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成。不过,FileSystemWatcher 对文件夹的监视要求文件夹必须存在,否则会产生错误“无效路径”。 那么,如果文件或文件夹不存在的时候可以怎么监视文件的改变呢?更麻烦的是如果顶层很多级文件夹都不存在,...

2019-01-01 10:53:40

阅读数:71

评论数:1

StyleCop 是什么,可以帮助团队带来什么价值?

StyleCop 本质上是一个 C# 源代码规则分析器,可以帮助团队成员强制执行一组代码样式和一致性规则。 本文将简述 StyleCop 以及它能为团队带来的价值。 本文内容StyleCop 是什么?StyleCop 能做什么,不能做什么?StyleCop 的优势和价值 StyleCop 是什么...

2019-01-01 10:52:19

阅读数:390

评论数:0

使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范

StyleCop 可以帮助强制执行代码格式化规范,ReSharper 可以帮助你更高效地编写代码。把两者结合起来,你便能高效地编写符合团队强制格式化规范的代码来。 本文就介绍如何使用 ReSharper 来高效地遵循 StyleCop 的代码格式化规范。 本文内容安装插件 StyleCop by...

2019-01-01 10:51:03

阅读数:28

评论数:0

Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)

我在之前的博客中有教大家如何编写 NuGet 工具包,其中就有编写 .targets 文件。 我在实际的使用中,发现 Visual Studio 2017 带来的含 Sdk 的新 csproj 格式基本上没有多少坑;然而旧的 csproj 文件却总是不能完美的运行,总是出错。关键是,不是每台电脑都...

2018-12-23 15:16:54

阅读数:44

评论数:0

.NET 中什么样的类是可使用 await 异步等待的?

我们已经知道 Task 是可等待的,但是去看看 Task 类的实现,几乎找不到哪个基类、接口或者方法属性能够告诉我们与 await 相关。 而本文将探索什么样的类是可使用 await 异步等待的? Dixin’s Blog - Understanding C# async / await (2)...

2018-12-23 15:15:37

阅读数:74

评论数:0

.NET 除了用 Task 之外,如何自己写一个可以 await 的对象?

.NET 中的 async / await 写异步代码用起来真的很爽,就像写同步一样。我们可以在各种各样的异步代码中看到 Task 返回值,这样大家便可以使用 await 等待这个方法。不过,有时需要写一些特别的异步方法,这时需要自己来实现一个可以异步等待的对象。 本文将讲述如何实现一个可等待对象...

2018-12-23 15:12:36

阅读数:42

评论数:0

定义一组抽象的 Awaiter 的实现接口,你下次写自己的 await 可等待对象时将更加方便

我在几篇文章中都说到了在 .NET 中自己实现 Awaiter 情况。async / await 写异步代码用起来真的很爽,就像写同步一样。然而实现 Awaiter 没有现成的接口,它需要你按照编译器的要求为你的类型添加一些具有特定名称的属性和方法。然而没有接口的帮助,我们编写起来就很难获得工具(...

2018-12-23 15:10:54

阅读数:31

评论数:0

不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 Lazy<T> 中导致死锁

WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型。其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程。 然而,如果你在 Lazy 上下文中使用了 Invoke,那么当这个 Lazy&amp;amp;lt;T&amp;amp;gt...

2018-12-23 14:58:39

阅读数:52

评论数:0

在有 UI 线程参与的同步锁(如 AutoResetEvent)内部使用 await 可能导致死锁

AutoResetEvent、ManualResetEvent、Monitor、lock 等等这些用来做同步的类,如果在异步上下文(await)中使用,需要非常谨慎。 本文将说一个在同步上下文中非常常见的一种用法,换成异步上下文中会产生死锁的问题。 本文内容一段正常的同步上下文的代码一个微调即会...

2018-12-23 14:58:02

阅读数:44

评论数:0

.NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况

一个简单的 Task 不会消耗多少时间,但如果你不合适地将 Task 转为同步等待,那么也可能很快耗尽线程池的所有资源,出现类似死锁的情况。 本文将以一个最简单的例子说明如何出现以及避免这样的问题。 本文内容耗时的 Task.Run最简复现代码原因解决更多死锁问题 耗时的 Task.Run 谁都...

2018-12-23 14:57:05

阅读数:42

评论数:0

了解 .NET 的默认 TaskScheduler 和线程池(ThreadPool)设置,避免让 Task.Run 的性能急剧降低

.NET Framework 4.5 开始引入 Task.Run,它可以很方便的帮助我们使用 async / await 语法,同时还使用线程池来帮助我们管理线程。以至于我们编写异步代码可以像编写同步代码一样方便。 不过,如果滥用,也可能导致应用的性能急剧下降。本文将说明在默认线程池配置(Thre...

2018-12-23 14:55:34

阅读数:77

评论数:0

将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3

在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF;同时还发布了 Visual Studio 2019 预览版。你可以基于 .NET Core 3 创建 WPF 程序。不过,如果你已经有基于 .NET Fra...

2018-12-06 10:30:32

阅读数:215

评论数:1

如何创建一个基于 .NET Core 3 的 WPF 项目

在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF;同时还发布了 Visual Studio 2019 预览版。不过 Visual Studio 2019 的预览版中并没有携带 WPF on .NET Cor...

2018-12-06 10:28:49

阅读数:405

评论数:0

提示
确定要删除当前文章?
取消 删除