我正在学习创建Windows服务和线程。我正在使用同事提供的库,它有助于构建线程服务,但这并没有给我基本级别的知识。
假设我将拥有一个长期运行的服务(比网上可用的基本示例稍微提前一点),需要每15秒唤醒一次然后执行其动作(基本上将始终运行)。操作涉及在数据库中查找状态,然后执行操作。
在这种情况下应如何处理以下事项:
1.处理螺纹
2.在行动比间隔执行时间更长的情况下。
我找到了以下示例,但我遇到了上述2点的问题。请记住,该服务将始终运行。
http://www.java2s.com/Tutorial/CSharp/0280__Development/CreatethedelegatethattheTimerwillcall.htm
using System;
using System.Threading;
class MainClass
{
public static void CheckTime(Object state)
{
Console.WriteLine(DateTime.Now);
}
public static void Main()
{
TimerCallback tc = new TimerCallback(CheckTime);
Timer t = new Timer(tc, null, 1000, 500);
Console.WriteLine("Press Enter to exit");
int i = Console.Read();
// clean up the resources
t.Dispose();
t = null;
}
}
所以在我的例子中,将会发生什么
1.停止事件
2.开始活动看起来不错吗?
3.如果在队列中找不到任何内容会发生什么?
4.如果行动的时间超过间隔时间怎么办?
public partial class QueueService : ServiceBase
{
public QueueService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
TimerCallback tc = new TimerCallback(CheckQueue);
Timer t = new Timer(tc, null, 10000, 15000); //first time wait for 10seconds and then execte every 15seconds
}
catch (Exception ex)
{
what should i be checking here and then also make sure that the threading/timer doesn't stop. It should still execute every 15 seconds
}
}
protected override void OnStop()
{
what needs to go here...
}
private static void CheckQueue(Object state)
{
... Connect to the DB
... Check status
... if queue status found then perform actions
. A
. C
. T
. I
. O
. N
. S
... if end
}
}
感谢您的期待!
答案 0 :(得分:1)
在检查队列之前停止计时器,并在完成后再次启动它。这样你就不会遇到共享内存或其他冲突的麻烦。
公共部分类QueueService:ServiceBase {
计时器计时器;
public QueueService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
TimerCallback tc = new TimerCallback(CheckQueue);
timer = new Timer(tc, null, 10000, 15000);
}
catch (Exception ex)
{
}
}
protected override void OnStop()
{
if (timer != null)
timer.Dispose();
}
private static void CheckQueue(Object state)
{
timer.Change(Timeout.Infinite, 0);
... Connect to the DB
... Check status
... if queue status found then perform actions
. A
. C
. T
. I
. O
. N
. S
... if end
timer.Change(10000, 15000);
}
}