使用filewatcher的c #windows服务

时间:2012-04-04 23:05:49

标签: c# windows-services filesystemwatcher windows-authentication

第一次发布长时间的读者。

我在Windows窗体应用程序内部构建了一个工作的filewatcher,在将其移动到Windows服务之前正常运行,现在我正在接受两个单独的问题。此文件观察程序读取用于行更新的flatfile(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.
    }

2 个答案:

答案 0 :(得分: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服务运行。否则,它将分配一个控制台,运行该服务,然后在退出服务之前等待按键。您可以在此基础上进行测试暂停并继续。

答案 1 :(得分:0)

用于调试:

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

关于其他问题:

我不完全确定你遇到了哪些问题,以及“课堂休息”和“双重事件触发器”的含义。

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

<强>链接:

这是一个代码项目文章的链接,该文章似乎已经实现了文件监视器Windows服务。也许有帮助:

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