如何处理/强制执行单实例线程

本文关键字:单实例 实例 线程 强制执行 处理 何处理 | 更新日期: 2023-09-27 18:24:00

我有一个"工作者"流程,它在专用服务器上不断运行,发送电子邮件,处理数据提取等。

我希望所有这些进程都异步运行,但我只希望每个进程的一个实例在任何时候运行。如果一个进程已经在运行,我不想再排队运行它。

[示例,简化]

while (true)
{
    // SLEEP HERE
        Task task1 = Task.Factory.StartNew(() => DataScheduleWorker.Run());
        Task task2 = Task.Factory.StartNew(() => EmailQueueWorker.Run());
}

基本上,我希望整个过程无休止地运行,每个任务彼此并行运行,但在任何时间点每个任务只有一个实例运行。

我如何在C#5中实现这一点?实现这一点的最干净/最好的方法是什么?

编辑

像这样简单的事情就足够了,还是会被认为是糟糕的?:

        Task dataScheduleTask = null;
        while (true)
        {
            Thread.Sleep(600);
            // Data schedule worker
            if (dataScheduleTask != null && dataScheduleTask.IsCompleted) dataScheduleTask = null;
            if (dataScheduleTask == null)
            {
                dataScheduleTask = Task.Factory.StartNew(() => DataScheduleWorker.Run());
            }
        }

如何处理/强制执行单实例线程

对于actors框架或TPL数据流来说,这听起来是一项完美的工作。从根本上讲,每个作业都有一个参与者(或块),等待消息并独立于其他参与者进行处理。在任何一种情况下,您的目标都应该是尽可能少地编写线程处理和消息传递代码——理想情况下不编写。这个问题已经在很大程度上得到了解决;你只需要评估可用的选项,并为你的任务使用最好的选项。我个人可能会从Dataflow开始。