.net 在C#中创建/重新启动运行dll中定义的函数的进程

7lrncoxx  于 2023-05-08  发布在  .NET
关注(0)|答案(1)|浏览(147)

我是C#的新手,我正在创建一个稍后将由Windows Process使用的dll(但现在我需要从控制台应用程序调用它进行测试),我从一个非常基本的dll开始,该dll具有扫描功能,然后以时间间隔删除特定文件夹中的文件,如果在一段时间后没有找到文件,我需要终止原始进程,然后重新启动它。
以下是DLL的代码,它可能需要一些修复/改进:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MyDll
{
    public class MyDLLFunctions
    {
        long TimeSinceLastProcessing;
        bool isActive;
        bool isProcessing;
         public MyDLLFunctions(String ConfigFilePath, bool ProcessBigFiles)
        {
            this.TimeSinceLastProcessing = DateTimeOffset.Now.ToUnixTimeSeconds();
            isActive = true;
        }

        public void StartScan()
        {
            // Set up the timer to check for new files every 30 seconds
            int interval = 30;
            int RestartAfterNSecondsOfInactivity = 120;
            long curTime = 0;
            Timer timer = new Timer(ScanInputFolders, null, 0, interval);
            while (true)
            { 
            
            // Wait before stopping the program
            Thread.Sleep(TimeSpan.FromSeconds(interval));
            curTime = DateTimeOffset.Now.ToUnixTimeSeconds();
                if(curTime - this.TimeSinceLastProcessing > RestartAfterNSecondsOfInactivity)
                {
                    break;
                }
            }
            timer.Dispose();
            isActive = false;
        }
        private void ScanInputFolders(object state)
        {
            if (!isProcessing)
            {
            isProcessing = true;
            string folderPath = @"C:\Devs\TestFiles\";
            // Check if there are any JSON files in the folder
            string[] jsonFiles = Directory.GetFiles(folderPath, "*.json");
              
            foreach (string jsonFile in jsonFiles)
                {
                    ProcessFoundFile(jsonFile);
                }

                    isProcessing = false;
            }

        }

        public bool IsActive()
        {
            return isActive;
        }

        private void ProcessFoundFile(String FilePath)
        {
            TimeSinceLastProcessing = DateTimeOffset.Now.ToUnixTimeSeconds(); // for test
            File.Delete(FilePath);
        }

    }
}

我的问题是如何从我的控制台应用程序中调用新进程*(或多个进程)**中的StartScan()(后面我将使用两个进程:一个用于大文件,一个用于小文件),以及如何知道处理何时终止(IsActive()=false)以终止和重新启动进程

pdtvr36n

pdtvr36n1#

要在新进程中调用StartScan(),可以使用C#中System.Diagnostics命名空间中的Process类。下面是一个例子:

Process process = new Process();
process.StartInfo.FileName = "MyDLLProcess.exe"; // the name of the executable containing MyDLLFunctions
process.StartInfo.Arguments = "true"; // pass the ProcessBigFiles argument
process.Start();

要将ProcessBigFiles参数传递给MyDLLFunctions构造函数,可以修改MyDLLProcess控制台应用的Main方法,如下所示:

static void Main(string[] args)
{
    bool processBigFiles = args.Length > 0 && bool.Parse(args[0]);
    MyDLLFunctions functions = new MyDLLFunctions("configFilePath", processBigFiles);
    functions.StartScan();
}

要知道处理何时终止,可以定期调用MyDLLFunctions示例的**IsActive()**方法。下面是一个示例,说明如何执行此操作:

Process process = new Process();
process.StartInfo.FileName = "MyDLLProcess.exe"; // the name of the executable containing MyDLLFunctions
process.StartInfo.Arguments = "true"; // pass the ProcessBigFiles argument
process.Start();

while (true)
{
    bool isActive = MyDLLFunctionsInstance.IsActive(); // check if the function is still active
    if (!isActive)
    {
        process.Kill(); // terminate the process
        process.Start(); // start a new process
        break;
    }
    Thread.Sleep(1000); // wait for 1 second before checking again
}

此代码启动该过程,然后进入一个无限循环,在此循环中,它使用**IsActive()方法定期检查函数是否仍然处于活动状态。如果该函数不再活动,它将终止当前进程,并使用process.Start()**启动一个新进程。您可以调整等待时间和其他参数以满足您的特定需求。

相关问题