服务开启后,读一个文件,根据文件来启动线程,我的文件定义的是记录的序列比如文件中的内容是:记录1
记录2
......
记录10服务就相应的启动10个线程,线程做的工作是不停地实时(每3秒)取实时数据(怎么取我知道,比如线程1取记录1中定义的),来做一些处理,比如判断当前实时值是否越限,没有越限,就每三秒重复取,重复判断,如果越限,就弹出一个对话框(告诉用户某个值越限了,用户就可以来处理它,比如中止这个判断进程),但是线程还是同时继续在检测,如果又不越限了,刚才那个对话框就会被线程关闭(也就是说用户还没有处理,这个越限自己结束了)几个问题:
1.这个读文件的操作应该写在服务的构造函数中还是OnStart函数中,还是在OnStart函数中启动一个线程来读文件?2.我把文件读到缓冲区,再逐个来启动线程,应该有个专门用来启动线程的线程,对吗?3.根据记录来启动的线程数要考虑到100个这个量,每个线程都是互不相关的,比如线程1检测到线程1的实时值越限,线程二也可能同时检测到线程2的实时值越限,都会同时有各自的处理,怎么对这100个线程管理?这样一个服务,应该有个怎么样的结构,目前还没有感觉,请给出建议!谢谢!
记录2
......
记录10服务就相应的启动10个线程,线程做的工作是不停地实时(每3秒)取实时数据(怎么取我知道,比如线程1取记录1中定义的),来做一些处理,比如判断当前实时值是否越限,没有越限,就每三秒重复取,重复判断,如果越限,就弹出一个对话框(告诉用户某个值越限了,用户就可以来处理它,比如中止这个判断进程),但是线程还是同时继续在检测,如果又不越限了,刚才那个对话框就会被线程关闭(也就是说用户还没有处理,这个越限自己结束了)几个问题:
1.这个读文件的操作应该写在服务的构造函数中还是OnStart函数中,还是在OnStart函数中启动一个线程来读文件?2.我把文件读到缓冲区,再逐个来启动线程,应该有个专门用来启动线程的线程,对吗?3.根据记录来启动的线程数要考虑到100个这个量,每个线程都是互不相关的,比如线程1检测到线程1的实时值越限,线程二也可能同时检测到线程2的实时值越限,都会同时有各自的处理,怎么对这100个线程管理?这样一个服务,应该有个怎么样的结构,目前还没有感觉,请给出建议!谢谢!
#####################################################################################还要补充一点,每当线程判断实时值越限了,就要向access数据库中写条记录,这里应该有个同步的问题吧?怎么处理好呢,线程数量要考虑100的量##########################################################################################################################################################################
----------------------------
很奇怪
我试了下
停止服务后再启动,还是会调用构造函数啊
>> 还是在OnStart函数中启动一个线程来读文件?可以再OnStart里面直接读文件,甚至可以在OnStart里面直接启动下面需要的线程。>> 2.我把文件读到缓冲区,再逐个来启动线程,应该有个专门用来启动线程的线程,对吗?不需要,可以在OnStart里面做。>> 3.根据记录来启动的线程数要考虑到100个这个量,每个线程都是互不相关的,
>> 比如线程1检测到线程1的实时值越限,线程二也可能同时检测到线程2的实时值越限,
>> 都会同时有各自的处理,怎么对这100个线程管理?线程之间没有共享资源或者通信的话不需要特殊的管理。
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是不是能满足要求?
>> 还是在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是不是能满足要求?
#####################################################################################
逐个检查的话可以实时吗,这样是否好点?一个线程检查,发现问题就开一个线程处理?
onstart事件只会在服务启动的时候执行一次,也就是您在服务控制台界面里启动服务的时候才会执行一次。以后的反复执行的任务可以按照Timer定义的时间间隔自动执行。这个Timer有一个事件elapsed,在这里写你要执行的代码就可以了。注意一定要使用System.Timers.Timer,从工具条中拖Timer控件是windows.forms.timer,他的tick事件在服务中无效。