C# Windows服务的逻辑&;获取更新
我使用vb.net开发了一个Windows服务,它使用OnStart执行以下操作C# Windows服务的逻辑&;获取更新,c#,vb.net,winforms,windows-services,C#,Vb.net,Winforms,Windows Services,我使用vb.net开发了一个Windows服务,它使用OnStart执行以下操作 从SQL表中获取所有条目 从返回的行创建计划 它工作得很好,安排了他们的时间和东西 问题:每当我必须向表中添加新行时,我都必须重新启动服务,以便它可以获取新创建的行。这给我带来了问题…可能有一个任务正在运行,重新启动服务可能会破坏系统 那么,处理这个问题的最佳方法是什么?新行是否可以在不重新启动的情况下加载到服务中 谢谢在数据库中使用轮询的概念。使用System.Threading.Timer类,设置一个调用回
- 从SQL表中获取所有条目
- 从返回的行创建计划
System.Threading.Timer
类,设置一个调用回调方法的时间间隔,该方法将负责轮询数据库中的新条目。此OnStart由Marc Gravell提供:
public void OnStart(string[] args) // should this be override?
{
var worker = new Thread(DoWork);
worker.Name = "MyWorker";
worker.IsBackground = false;
worker.Start();
}
void DoWork()
{
// do long-running stuff
}
请注意,OnStart
可以启动多个线程,或者可以根据需要使用启动的第一个线程来启动其他线程。这允许您设置数据库轮询或在消息队列上等待数据的线程
一个有用的提示: 将
Main
添加到您的服务允许您在Visual Studio中将其作为控制台应用程序运行。这大大简化了调试
static void Main(string[] args)
{
ServiceTemplate service = new ServiceTemplate();
if (Environment.UserInteractive)
{
// The application is running from a console window, perhaps creating by Visual Studio.
try
{
if (Console.WindowHeight < 10)
Console.WindowHeight = 10;
if (Console.WindowWidth < 240) // Maximum supported width.
Console.WindowWidth = 240;
}
catch (Exception)
{
// We couldn't resize the console window. So it goes.
}
service.OnStart(args);
Console.Write("Press any key to stop program: ");
Console.ReadKey();
Console.Write("\r\nInvoking OnStop() ...");
service.OnStop();
Console.Write("Press any key to exit: ");
Console.ReadKey();
}
else
{
// The application is running as a service.
// Misnomer. The following registers the services with the Service Control Manager (SCM). It doesn't run anything.
ServiceBase.Run(service);
}
}
static void Main(字符串[]args)
{
ServiceTemplate服务=新建ServiceTemplate();
if(Environment.UserInteractive)
{
//应用程序是从控制台窗口运行的,可能是由VisualStudio创建的。
尝试
{
如果(控制台窗口高度<10)
控制台窗口高度=10;
if(Console.WindowWidth<240)//支持的最大宽度。
Console.WindowWidth=240;
}
捕获(例外)
{
//我们无法调整控制台窗口的大小。所以它是这样的。
}
服务启动(args);
编写(“按任意键停止程序:”);
Console.ReadKey();
Console.Write(“\r\nInvoking OnStop()…”;
service.OnStop();
控制台。写入(“按任意键退出:”);
Console.ReadKey();
}
其他的
{
//应用程序正在作为服务运行。
//名称错误。以下内容向服务控制管理器(SCM)注册服务。它不运行任何内容。
ServiceBase.Run(服务);
}
}
您可以标记条目,例如使用标志或添加行的日期/时间,并让服务定期检查新行。您可以使用表上的insert触发器通过服务代理为服务排队消息。这取决于您是否愿意拉入或推入新数据。但是…OnStart事件如何一次加载所有行。我无法使用新行再次触发onStart事件。我一定是缺少什么。OnStart将需要启动另一个工作线程。该线程将通过等待计时器定期检查数据库,或者连接到队列并等待消息。该线程如何将任何新数据集成到计划中取决于您的应用程序。OnStart不应进行耗时的处理。它应该启动一个或多个工作线程,然后返回到服务控制器。如果您可以为onStart事件设置一个非常简单的基本代码结构,那就太好了。这里有一个编写onStart的最小示例。我的代码在Windows服务的onStart事件中……您是说我应该在onStart事件中保持池化吗?onStart事件在服务启动后运行,并将所有数据带入服务。@FSX-池或轮询?@highwingers,是的,在onStart中,您可以初始化计时器并启动它。稍后,回调方法将按常规间隔(用户设置的间隔)调用。@HABO,可能是轮询。谢谢你纠正我的错误,我总是搞混。