You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:33:11