【发布时间】:2021-03-04 13:10:38
【问题描述】:
我编写了一个用于 ASP.NET Core 5 的简单去抖动器(用于检测对配置文件的更改)。这将在Startup 类中使用。效果很好。
但是我收到了分析器警告:
不通过 TaskScheduler csharp(CA2008) 就不要创建任务
问题代码:
Task.Delay(TimeSpan.FromSeconds(2)).ContinueWith(
task => someAction(),
cancellationToken
);
我应该使用以下哪些,它们有何不同?
Task.Delay(TimeSpan.FromSeconds(2)).ContinueWith(
task => someAction(),
cancellationToken,
TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext() // <---
);
Task.Delay(TimeSpan.FromSeconds(2)).ContinueWith(
task => someAction(),
cancellationToken,
TaskContinuationOptions.None,
TaskScheduler.Default // <---
);
【问题讨论】:
-
ASP.NET Core 不使用
SynchronizationContext。请阅读Stephen Cleary's article -
你应该使用
TaskScheduler.Default -
@lonix 常用的方法是使用文件配置提供程序并让 it 处理更改。不应该有任何理由来处理多个更改,除非
appsettings以不寻常的方式使用 - 例如重写它以修改单个条目或更糟,让应用程序本身修改文件。如果您想在运行时更改设置,请使用不同的源,例如内存中的源 -
@lonix 实际上,修改应用程序在收到更改通知时可能仍在写入目标,导致当您尝试读取修改后的文件时file access exceptions。唯一的解决方案是“去抖动”更改事件,并仅在经过足够的空闲时间后才响应它们。像 ReactiveX 这样的库让这变得容易多了。如果没有 Rx,您可以让每个事件重置一个计时器,其处理程序负责处理通知。
-
@lonix 我在 2010 年构建了一个类似于 Dropbox 的文件同步工具,用于同步大型 VHD 文件。我花了一段时间才意识到为什么当有人将 VHD 复制到同步文件夹时我收到的更改通知如此之少。 Explorer 足够聪明,可以预先分配整个文件。之后,仅当复制缓冲区刷新到磁盘时才会引发更改事件。 Windows 会动态更改缓冲区大小,因此我在复制大量小文件时观察到的结果与客户在“出于测试目的”复制 4GB 的《权力的游戏》剧集时观察到的不同
标签: c# asp.net-core task asp.net-core-5.0