如何在C#中实现多程序实例串行执行而非并行?
当然可以实现!在C#中搞定多实例串行执行的方案
你的需求完全可以通过C#的跨进程同步机制实现,核心思路是用系统级的同步原语让多个程序实例共享一个“执行许可”,同一时间只有一个实例能拿到许可并执行任务,其余实例等待许可释放后再依次执行。下面给你两种最常用的实现方案:
方案一:使用命名互斥锁(Named Mutex)
命名互斥锁是Windows系统提供的跨进程同步工具,它的名字是全局可见的,所有进程都能通过这个名字找到同一个互斥锁。我们可以让每个程序实例启动后先尝试获取这个互斥锁,成功获取的实例执行任务,执行完后释放锁;没获取到的实例会自动等待,直到锁被释放。
示例代码:
using System; using System.Threading; class Program { static void Main(string[] args) { // 定义一个唯一的互斥锁名称,建议加上你的程序专属标识避免冲突 const string MutexName = "MyAppUniqueExecutionMutex_12345"; // initiallyOwned设为false:我们不直接拥有锁,而是尝试获取 using (var mutex = new Mutex(false, MutexName)) { try { // 等待获取互斥锁,超时时间可以按需设置,这里设为无限等待 mutex.WaitOne(); // 这里写你的任务逻辑,比如模拟耗时操作 Console.WriteLine($"实例{Environment.ProcessId}开始执行任务..."); Thread.Sleep(3000); // 模拟3秒的任务 Console.WriteLine($"实例{Environment.ProcessId}任务执行完成!"); } finally { // 无论任务成功还是失败,都要释放锁,避免其他实例永远等待 mutex.ReleaseMutex(); } } } }
方案二:使用命名信号量(Named Semaphore)
信号量和互斥锁类似,但它支持同时允许多个进程获取许可。我们把信号量的初始计数和最大计数都设为1,就实现了和互斥锁一样的“独占访问”效果,同样能让实例串行执行。
示例代码:
using System; using System.Threading; class Program { static void Main(string[] args) { // 唯一的信号量名称 const string SemaphoreName = "MyAppUniqueExecutionSemaphore_12345"; // 初始计数1,最大计数1:同一时间只能有一个进程获取许可 using (var semaphore = new Semaphore(1, 1, SemaphoreName)) { try { // 等待获取信号量许可 semaphore.WaitOne(); // 任务逻辑 Console.WriteLine($"实例{Environment.ProcessId}开始执行任务..."); Thread.Sleep(3000); Console.WriteLine($"实例{Environment.ProcessId}任务执行完成!"); } finally { // 释放许可,让下一个等待的实例获取 semaphore.Release(); } } } }
注意事项
- 同步原语的名称一定要唯一,建议加上程序的GUID或者公司前缀,防止和系统中其他程序的同步对象冲突。
- 必须用
try-finally块确保锁/信号量被释放,哪怕任务执行过程中抛出异常,也不会导致其他实例永远等待。 - 如果你需要区分“正常完成”和“异常终止”的情况,可以在释放锁前做额外的状态处理,但核心的同步逻辑不变。
内容的提问来源于stack exchange,提问作者Nico.E
相关产品推荐
相关产品推荐

