C# 在另一个控制台应用程序启动时暂停一个控制台应用程序

Posted

技术标签:

【中文标题】C# 在另一个控制台应用程序启动时暂停一个控制台应用程序【英文标题】:C# Pause one console application when other console application starts 【发布时间】:2018-11-13 14:57:57 【问题描述】:

我有一个用于测试目的的控制台应用程序,如下所示:

static void Main(string[] args)

    do
    
        for (int i = 0; i < 10000000; i++)
        
            Console.WriteLine("Doing some endless loop");
            Console.WriteLine(i.ToString());
        
     while (true);

如您所见,代码非常基本,我已将其设置为无限循环以测试我想要实现的目标。

另一个控制台应用程序称为“Updater”,我想在“Updater”应用程序启动后暂停“EndlessLoop”控制台应用程序。

有谁知道这在 c# .NET 中是否可行?

【问题讨论】:

您要暂停此应用程序,还是要杀死此应用程序? if (Process.GetProcessesByName("Updater.exe").Any()) //pause your code ? 要真正控制两个应用程序之间的同步,您可以使用命名互斥体。 看看Mutex class。 不是重复的,但有点相关:***.com/questions/9803432/… 【参考方案1】:
public static bool IsAppRunning()

    foreach (Process process in Process.GetProcesses())
    
        if (process.ProcessName.Contains("Updater"))
        
            return true;
        
    

    return false;

如果你在 while 循环中调用它,它会告诉你 Updater 是否正在运行。

【讨论】:

两个问题。 1)忙等待循环是资源的浪费。 2)使用“包含”来查找进程名称只是在乞求问题。例如,如果某个名为“CriticalFileUpdater”的其他进程启动,您的代码将在不应该返回时返回true 忙循环等待,是的,使用睡眠或任何东西,不会很忙。使用 Equals("Updater.exe") 然后... 既然有专门为这项工作设计的简单可靠的工具,为什么还要拼凑一些东西呢?即使是睡眠循环也是一个忙碌的等待;它只是比没有睡眠的循环更不忙。为工作使用正确的工具。 什么工具?如果您说使用正确的工具,而不是说哪个?我认为你不需要优化这个叫做微优化的小代码,因为它是如此简单和轻量。 不错... :D 谢谢。 (但它只有在您可以从其他应用程序发送该信号时才有效。:p)【参考方案2】:

两个应用程序之间不容易通信

一个提议:当您的控制台Updater 启动时,您在文件夹C:\Temps\token.txt 中创建一个文件。然后,如果您的控制台EndlessLoopC:\Temps 中检测到文件名token.txt,则暂停EndlessLoop

【讨论】:

应用程序之间的通信一点也不难。有许多在 C# 中使用命名事件进行应用程序间通信的示例。例如,请参阅***.com/q/480430/56778。 @JimMischel 是的,但我认为我的提议仍然很简单 是的,很简单。它还需要一个繁忙的等待循环或FileSystemWatcher,如果有人删除文件或在不期望的情况下创建它,它可能会失败。它适用于非关键系统,但根本不可靠。我当然不建议使用文件系统进行实时的应用程序间通信。尤其是当使用命名事件句柄既简单又可靠时。

以上是关于C# 在另一个控制台应用程序启动时暂停一个控制台应用程序的主要内容,如果未能解决你的问题,请参考以下文章

用C#写了一个控制台程序,如何让它作为服务来运行

Oracle Dll 加载错误:无法在另一台机器上运行 C# 控制台应用程序

变电站机器人的控制部分

c#控制台程序 要输入的变量为一个文件夹的路径时该怎样写

暂停,输入命令并恢复控制台应用程序

从 Visual Studio 启动时,C# ReleaseMutex() 未在控制台应用程序的多个实例中释放互斥锁