【发布时间】:2021-11-07 02:00:50
【问题描述】:
我已经有一些在 Windows 中使用线程的经验,但大部分经验来自在 C/C++ 应用程序中使用 Win32 API 函数。然而,当谈到 .NET 应用程序时,我经常不确定如何正确处理多线程。有线程、任务、TPL 和其他各种我可以用于多线程的东西,但我不知道何时使用这些选项中的哪一个。 我目前正在开发基于 C# 的 Windows 服务,该服务需要定期验证来自不同数据源的不同数据组。实现验证本身对我来说并不是一个真正的问题,但我不确定如何处理同时运行的所有验证。 我需要一个解决方案,让我可以做以下所有事情:
- 以不同的(预定义的)间隔运行验证。
- 从一个地方控制所有不同的验证,以便我可以在必要时暂停和/或停止它们,例如当用户停止或重新启动服务时。
- 尽可能高效地使用系统资源以避免性能问题。
到目前为止,我只有一个类似的项目,之前我只是使用 Thread 对象结合 ManualResetEvent 和带有超时的 Thread.Join 调用来通知线程何时停止服务。这些线程中定期执行某些操作的逻辑如下所示:
while (!shutdownEvent.WaitOne(0))
{
if (DateTime.Now > nextExecutionTime)
{
// Do something
nextExecutionTime = nextExecutionTime.AddMinutes(interval);
}
Thread.Sleep(1000);
}
虽然这确实按预期工作,但我经常听说像这样直接使用线程被认为是“老派”甚至是一种不好的做法。我还认为这个解决方案不能非常有效地使用线程,因为它们大部分时间都在睡觉。我怎样才能以更现代和更有效的方式实现这样的目标? 如果这个问题太模糊或基于意见,请告诉我,我会尽力使其尽可能具体。
【问题讨论】:
-
简化:使用
Task代替Thread。首选asyncawait语法。 -
不确定这个库是否有帮助 hangfire.io
标签: c# multithreading thread-safety task task-parallel-library