服务开启后,读一个文件,根据文件来启动线程,我的文件定义的是记录的序列比如文件中的内容是:记录1
记录2
......
记录10服务就相应的启动10个线程,线程做的工作是不停地实时(每3秒)取实时数据(怎么取我知道,比如线程1取记录1中定义的),来做一些处理,比如判断当前实时值是否越限,没有越限,就每三秒重复取,重复判断,如果越限,就弹出一个对话框(告诉用户某个值越限了,用户就可以来处理它,比如中止这个判断进程),但是线程还是同时继续在检测,如果又不越限了,刚才那个对话框就会被线程关闭(也就是说用户还没有处理,这个越限自己结束了)几个问题:
1.这个读文件的操作应该写在服务的构造函数中还是OnStart函数中,还是在OnStart函数中启动一个线程来读文件?2.我把文件读到缓冲区,再逐个来启动线程,应该有个专门用来启动线程的线程,对吗?3.根据记录来启动的线程数要考虑到100个这个量,每个线程都是互不相关的,比如线程1检测到线程1的实时值越限,线程二也可能同时检测到线程2的实时值越限,都会同时有各自的处理,怎么对这100个线程管理?这样一个服务,应该有个怎么样的结构,目前还没有感觉,请给出建议!谢谢!

解决方案 »

  1.   

    #####################################################################################
    #####################################################################################还要补充一点,每当线程判断实时值越限了,就要向access数据库中写条记录,这里应该有个同步的问题吧?怎么处理好呢,线程数量要考虑100的量##########################################################################################################################################################################
      

  2.   

    msdn中说:当您对服务首次调用“开始”时,可执行文件调用 ServiceBase 派生类的构造函数。在构造函数执行之后将立即调用 OnStart 命令处理方法。在服务首次加载之后,构造函数不会再次执行,因此有必要将构造函数执行的处理和 OnStart 执行的处理分开。可以由 OnStop 释放的任何资源都应在 OnStart 中创建。如果服务在 OnStop 释放资源后再次启动,那么,在构造函数中创建资源会妨碍这些资源的正确创建。说明这个读文件的操作不可以写在服务的构造函数中,那是直接写在OnStart函数中,还是在OnStart函数中启动一个专门的读文件线程来读文件?
      

  3.   

    msdn中说:当您对服务首次调用“开始”时,可执行文件调用 ServiceBase 派生类的构造函数。在构造函数执行之后将立即调用 OnStart 命令处理方法。在服务首次加载之后,构造函数不会再次执行,因此有必要将构造函数执行的处理和 OnStart 执行的处理分开。可以由 OnStop 释放的任何资源都应在 OnStart 中创建。如果服务在 OnStop 释放资源后再次启动,那么,在构造函数中创建资源会妨碍这些资源的正确创建。
    ----------------------------
    很奇怪
    我试了下
    停止服务后再启动,还是会调用构造函数啊
      

  4.   

    >> 1.这个读文件的操作应该写在服务的构造函数中还是OnStart函数中,
    >> 还是在OnStart函数中启动一个线程来读文件?可以再OnStart里面直接读文件,甚至可以在OnStart里面直接启动下面需要的线程。>> 2.我把文件读到缓冲区,再逐个来启动线程,应该有个专门用来启动线程的线程,对吗?不需要,可以在OnStart里面做。>> 3.根据记录来启动的线程数要考虑到100个这个量,每个线程都是互不相关的,
    >> 比如线程1检测到线程1的实时值越限,线程二也可能同时检测到线程2的实时值越限,
    >> 都会同时有各自的处理,怎么对这100个线程管理?线程之间没有共享资源或者通信的话不需要特殊的管理。
      

  5.   

    >> 这样一个服务,应该有个怎么样的结构,目前还没有感觉,请给出建议!谢谢!有这样几个Design的问题需要考虑:
    1. Service是不可以直接和用户交互的(比如探出一个对话框之类)。所以你至少需要两个Project:一个Windows Service,只管接收数据判断越界;一个Windows Form程序,负责在越界的情况下显示对话框。这两个程序的通信方式最好使用Remoting。2. 继续1的问题,如果越界的时候没有用户Login怎么办,或者用户没有运行WinForm程序怎么办?是否需要把情况记录在EventLog里面或者提供其他的Notify方式(email,etc)3. 如果需要的只是每个3秒检查N各不同的数据源,为什么一定要N个独立线程?如果用一个系统Timer (System.Timers.Timer),每隔3秒运行一个函数,逐个检查这些数据源并且触发越界Event是不是能满足要求?
      

  6.   

    >> 1.这个读文件的操作应该写在服务的构造函数中还是OnStart函数中,
    >> 还是在OnStart函数中启动一个线程来读文件?可以再OnStart里面直接读文件,甚至可以在OnStart里面直接启动下面需要的线程。
    #####################################################################################
    如果要启动的线程数较多,可能需要较长的时间,可能会导致服务起不来啊?
    >> 3.根据记录来启动的线程数要考虑到100个这个量,每个线程都是互不相关的,
    >> 比如线程1检测到线程1的实时值越限,线程二也可能同时检测到线程2的实时值越限,
    >> 都会同时有各自的处理,怎么对这100个线程管理?线程之间没有共享资源或者通信的话不需要特殊的管理。
    #####################################################################################
    每当线程判断实时值越限了,就要向access数据库中写条记录,这里应该有个同步的问题吧?怎么处理好呢,线程数量要考虑100的量
    1. Service是不可以直接和用户交互的(比如探出一个对话框之类)。所以你至少需要两个Project:一个Windows Service,只管接收数据判断越界;一个Windows Form程序,负责在越界的情况下显示对话框。这两个程序的通信方式最好使用Remoting。
    #####################################################################################
    我准备在线程中用无模式对话框,不可以吗?如果再用单独的project,感觉太麻烦
    3. 如果需要的只是每个3秒检查N各不同的数据源,为什么一定要N个独立线程?如果用一个系统Timer (System.Timers.Timer),每隔3秒运行一个函数,逐个检查这些数据源并且触发越界Event是不是能满足要求?
    #####################################################################################
    逐个检查的话可以实时吗,这样是否好点?一个线程检查,发现问题就开一个线程处理?
      

  7.   

    1. 就算是启动100个线程,也不会需要很长的时间。倒是启动以后的运行性能需要考虑。2. 只要对读写数据库的部分加lock就好 --- 如果用SQL,这个也免了。3. Service根本就不在你当前账号的登陆空间里面运行,什么用户界面也显示不出来。你可以使试试看。4. 要看检查的复杂程度了,如果只是变量范围测试不会有任何问题。如果启动100个线程,县城切换会消耗大量CPU资源,反而比单个线程更不“实时”。Windows操作系统的工作模式是不可能写出完全实时的程序的。
      

  8.   

    都没代码??能不能写个代码出来,我刚好急用,我的要求是:服务开启,读的文件是xml!!
      

  9.   

    ekauq说的对,象这种反复执行的任务使用 System.Timers.Timer就足够了。
    onstart事件只会在服务启动的时候执行一次,也就是您在服务控制台界面里启动服务的时候才会执行一次。以后的反复执行的任务可以按照Timer定义的时间间隔自动执行。这个Timer有一个事件elapsed,在这里写你要执行的代码就可以了。注意一定要使用System.Timers.Timer,从工具条中拖Timer控件是windows.forms.timer,他的tick事件在服务中无效。