【发布时间】:2011-10-20 00:44:14
【问题描述】:
我目前在将我的 Windows 服务部署到 Win2k3 服务器时遇到了 System.Threading.Timer 问题。当我安装它时,它在我的本地机器上每秒都可以正常工作(出于调试目的过度杀伤),但是在我将它安装到服务器之后,服务成功启动然后永远不会触发一次计时器事件。有没有人遇到过类似的情况?我的大部分研究都发现了从很久以前就在 .NET 1.1 中明显普遍存在的问题。感谢您的时间和帮助。
protected override void OnStart(string[] args)
{
int interval = Int32.Parse(ConfigurationManager.AppSettings["SleepTime"]) * 1000;
TimerCallback cb = new TimerCallback(ProcessTimerEvent);
QueueWorker worker = new QueueWorker();
workTimer = new Timer(cb, worker, interval, 1000);
}
private static void ProcessTimerEvent(object obj)
{
if (obj is QueueWorker)
{
QueueWorker qw = (QueueWorker)obj;
qw.doWork();
}
}
class QueueWorker
{
public void doWork()
{
// work happening here
}
}
更新:
我发现它与服务需要运行的用户有关。当服务作为系统运行时,线程工作得很好。任何人都知道用户需要哪些权限才能运行线程?我尝试在本地安全设置中使用“作为操作系统的一部分”,但这只会导致服务启动,然后在以我添加的用户身份登录时立即失败。
【问题讨论】:
-
非常明显的问题:服务器上
SleepTime的 app.Config 值是多少?其他选项:改用System.Timers.Timer。 -
在以这种方式实现之前,我有一个 System.Timers.Timer。我在我的服务器上得到了相同的行为,服务将启动,然后计时器事件将永远不会触发。然后我读到 Win 2k3 服务器做了一些有趣的线程处理,而 Timer 可能无法按我的预期工作。出于我的测试目的,现在的 SleepTime 值是 1 秒。稍后,当我不测试时,它将成为我需要的任何东西。
-
你能发布关于 w2k3 行为的链接吗?你能建立一个控制台测试应用程序来排除赢服务的东西吗?使用
Console.WriteLine进行测试也会更容易。而且,很抱歉提出愚蠢的问题,SleepTime是 1000 毫秒 = 1 秒,对吧? -
我可能会构建一个控制台测试应用程序,但我认为 Win2k3 服务器的问题在于服务中的线程是一开始的问题。是的,1000 毫秒 = 1 秒。