【问题标题】:Which task scheduler should I use for ContinueWith in ASP.NET Core我应该为 ASP.NET Core 中的 ContinueWith 使用哪个任务调度程序
【发布时间】: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


【解决方案1】:

根据this,ASP.NET Core 没有SynchronizationContext

所以根据@MatthewWatson 上面的评论,可以使用TaskScheduler.Default

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多