我有一个"工人"在专用服务器上不断运行的进程,发送电子邮件,处理数据提取等。
我想让所有这些进程异步运行,但我只想让每个进程的一个实例同时运行。如果进程已在运行,我不想排队再次运行它。
[例如,简化]
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());
}
}
答案 0 :(得分:4)
对于actors框架或可能TPL Dataflow来说,这听起来是完美的工作。从根本上说,每个作业都有一个演员(或块),等待消息并独立于其他演员处理它们。在任何一种情况下,您的目标应该是尽可能少地编写线程处理和消息传递代码 - 理想情况下没有。这个问题已经基本解决了;您只需要评估可用选项并使用最适合您的选项。我个人可能会从Dataflow开始。