Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理/实施单实例线程_C#_Multithreading - Fatal编程技术网

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

C# 如何处理/实施单实例线程,c#,multithreading,C#,Multithreading,我有一个“worker”进程,它在专用服务器上不断运行,发送电子邮件,处理数据提取等 我希望所有这些进程都异步运行,但我只希望每个进程在任何时间运行一个实例。如果进程已经在运行,我不想再次排队运行它 [示例,简化] while (true) { // SLEEP HERE Task task1 = Task.Factory.StartNew(() => DataScheduleWorker.Run()); Task task2 = Task.Fa

我有一个“worker”进程,它在专用服务器上不断运行,发送电子邮件,处理数据提取等

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

[示例,简化]

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

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

这听起来像是一个完美的工作,无论是对于一个框架,还是可能的话。基本上,每个作业都有一个参与者(或块),等待消息并独立于其他参与者处理它们。在任何一种情况下,您的目标都应该是尽可能少地编写线程处理和消息传递代码——理想情况下不编写任何代码。这个问题已经基本解决了,;您只需评估可用选项,并为您的任务使用最佳选项。我个人可能会从数据流开始。

我不太清楚为什么要在循环中创建线程而不是重用工作线程。您可以查看SemaphoreSlim.wait()来阻止它们。对不起,我的意思是在伪代码中使用任务。更新。SemaphoreSlim.Wait()会让它们排队吗?这在软件工程中被称为“互斥”。你可以使用互斥锁。把它复杂化没什么意义。谢谢汉斯。我对互斥体的理解是,它将对请求进行排队。我会用信号量LIM再读一次。您可以检查它是否正在运行,并且只在“crossroads”为空时输入信号量,否则将跳过创建。使用互斥也应该可以实现这一点(好吧,似乎不是),但如果我今天开始解决这样的问题,我肯定会首先看看Jon Sket建议的TPL数据流。管理多线程总是比预期的复杂。我不太清楚为什么要在循环中创建线程而不是重用工作线程。您可以查看SemaphoreSlim.wait()来阻止它们。对不起,我的意思是在伪代码中使用任务。更新。SemaphoreSlim.Wait()会让它们排队吗?这在软件工程中被称为“互斥”。你可以使用互斥锁。把它复杂化没什么意义。谢谢汉斯。我对互斥体的理解是,它将对请求进行排队。我会用信号量LIM再读一次。您可以检查它是否正在运行,并且只在“crossroads”为空时输入信号量,否则将跳过创建。使用互斥也应该可以实现这一点(好吧,似乎不是),但如果我今天开始解决这样的问题,我肯定会首先看看Jon Sket建议的TPL数据流。管理多线程总是比预期的更复杂