2

第一次发布长期读者。

在将其移动到 Windows 服务之前,我在 Windows 窗体应用程序中构建了一个正常工作的文件观察器,该应用程序 100% 正常运行,现在收到两个单独的问题。该文件观察器读取平面文件以进行行更新(lastwrite),删除/重新创建文件(streamwriter),最后解析强类型数据集,然后上传到 SQL 服务器。(这是我的第一个 Windows 服务) 问题:
1. filewatcher 中的双重事件触发对服务的影响是否与表单应用程序不同?
2. 如果我调用的类没有问题,为什么线程会中断,有没有人回答?
3. 通过 Windows 服务进行 Windows 身份验证是否存在任何已知问题?
4. 有没有强大的windows服务调试方法?

这是我的windows服务代码,提前感谢,如果代码中有愚蠢的错误,我深表歉意,再次第一次制作windows服务。

    FileMonitor m_FileMonitor;
    public WindowsService()
    {
        InitializeComponent();
    }
    protected override void OnStart(string[] args)
    {
            try
            {
                Thread myThread = new Thread(DoTheWork);
                myThread.Start();
            }
            catch
            {

            }

    }
    void DoTheWork()
    {
        m_FileMonitor = new FileMonitor(Properties.Settings.Default.PathToFileToWatch, Properties.Settings.Default.PathToErrorLog);
    }
    protected override void OnStop()
    {
        // TODO: Add code here to perform any tear-down necessary to stop your service.
    }
4

2 回答 2

2

对于调试,请确保您的项目类型是 Windows 应用程序,然后使用:

[DllImport("kernel32")]
static extern bool AllocConsole();

private static void Main(string[] args)
{
    var service = new MyService();
    var controller = ServiceController.GetServices().FirstOrDefault(c => c.ServiceName == service.ServiceName);
    if (null != controller && controller.Status == ServiceControllerStatus.StartPending)
    {
        ServiceBase.Run(service);
    }
    else
    {
        if (AllocConsole())
        {
            service.OnStart(args);
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
            service.OnStop();
        }
        else
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }
    }
}

如果代码因为 Windows 服务启动而运行,它将作为 Windows 服务运行。否则它将分配一个控制台,运行服务,然后在退出服务之前等待按键。您可以在此基础上测试暂停并继续。

于 2012-04-04T23:33:03.473 回答
0

对于调试:

您必须使用ServiceBase.Runin 方法Main()作为 Windows 服务执行,但您可以在 main 方法中进行切换以运行与普通控制台应用程序相同的应用程序(例如--standalone)。我在我的所有服务上都使用它来使它们易于调试。

关于其他问题:

我不完全确定您遇到哪些问题以及“班级休息”和“双事件触发”是什么意思。

Windows 服务在一个特殊的服务帐户下运行,该帐户可能有权也可能没有权限来查看您感兴趣的目录。如果需要,您可以更改服务帐户或授予其对目录的权限。

链接:

这是一个codeproject文章的链接,该文章似乎已经实现了文件观察程序windows服务。也许它有帮助:

http://www.codeproject.com/Articles/18521/How-to-implement-a-simple-filewatcher-Windows-serv

于 2012-04-04T23:09:08.620 回答