首页 > 解决方案 > 将自定义模块作为服务运行,而不是启动 WinForms 应用程序

问题描述

我为 Kofax 创建了一个自定义模块。该模块是一个 WinForms 应用程序,具有运行时表单和设置表单(管理模块)。

对于运行时应用程序,我使用此代码


Program.cs - 启动运行时表单

internal static class Program
{
    [STAThread]
    private static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FrmMain());
    }
}

FrmMain.cs - 初始化 UI 并创建所需的实例

public partial class FrmMain : Form
{
    private BatchProcessor batchProcessor;
    private BatchManager batchManager;
    private SessionManager sessionManager;

    public FrmMain()
    {
        InitializeComponent();
    }

    private void FrmMain_Load(object sender, EventArgs e)
    {
        try
        {
            batchProcessor = new BatchProcessor();
            sessionManager = new SessionManager();
            batchManager = new BatchManager(batchProcessor, sessionManager);
            // UpdateUI();              
            timerBatchPolling.Enabled = true;
        }
        catch (Exception exception)
        {
            throw exception;
        }
    }

    private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
    {
        timerBatchPolling.Enabled = false;

        try
        {
            sessionManager.Logout();
        }
        catch (Exception exception)
        {
            throw exception;
        }
    }

    private void timerBatchPolling_Tick(object sender, EventArgs e)
    {
        timerBatchPolling.Enabled = false;
        batchManager.BatchPolling();
        // UpdateUI();
        timerBatchPolling.Enabled = true;
    }
}

BatchManager.cs - 要求处理下一批

internal class BatchManager
{
    private BatchProcessor batchProcessor;
    private SessionManager sessionManager;

    public IBatch CurrentActiveBatch { get; private set; }

    public BatchManager(BatchProcessor batchProcessor, SessionManager sessionManager)
    {
        this.batchProcessor = batchProcessor;
        this.sessionManager = sessionManager;
        this.sessionManager.LoginToRuntimeSession();
    }

    public void BatchPolling()
    {
        CurrentActiveBatch = sessionManager.GetNextBatch();

        if (CurrentActiveBatch != null)
        {
            batchProcessor.ProcessBatch(CurrentActiveBatch);
        }
        else
        {
            sessionManager.Logout();
        }
    }
}

BatchProcessor.cs - 处理批处理

internal class BatchProcessor
{
    public void ProcessBatch(IBatch batch)
    {
        // ...
    }
}

我刚刚看到也可以将自定义模块作为服务运行。我不知道如何注册它们或如何设置代码,所以我问是否有办法更改我的代码以将模块变成服务而不是表单应用程序。

感谢帮助!

标签: kofax

解决方案


创建一个派生自ServiceBase的新类。两个相关的方法是OnStartand ,在这里OnStop阅读更多关于它们的信息。这是一个示例,请注意这是我的自定义类之一,它负责登录 KC、处理批处理等。CustomModule

protected override void OnStart(string[] args)
{
    // TODO: Add code here to start your service.
    cm = new CustomModule();
    cm.Login("", "");

    if (CustomModule.BatchNotificationEnabled == true)
    {
        cm.ListenForNewBatches();
    }
    else
    {
        cm.PollForNewBatches();
    }
}

为了安装服务,您可以添加另一个派生自Installer的类,但这完全是可选的。但是,我建议您加倍努力,因为这将允许您以与所有 Kofax 模块相同的样式安装和卸载 CM MyCustomModule.exe -install:.

最后,在您的 中Program.cs,检查用户是否以交互方式启动了模块:

if (Environment.UserInteractive)
{
    // run as module
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new RuntimeForm(args));
}
else
{
    // run as service
    ServiceBase.Run(new CustomModuleService());
}

推荐阅读