如何处理/实施单实例线程

时间:2014-09-22 16:41:47

标签: c# multithreading

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

我想让所有这些进程异步运行,但我只想让每个进程的一个实例同时运行。如果进程已在运行,我不想排队再次运行它。

[例如,简化]

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());
            }
        }

1 个答案:

答案 0 :(得分:4)

对于actors框架或可能TPL Dataflow来说,这听起来是完美的工作。从根本上说,每个作业都有一个演员(或块),等待消息并独立于其他演员处理它们。在任何一种情况下,您的目标应该是尽可能少地编写线程处理和消息传递代码 - 理想情况下没有。这个问题已经基本解决了;您只需要评估可用选项并使用最适合您的选项。我个人可能会从Dataflow开始。