Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows服务的逻辑&;获取更新_C#_Vb.net_Winforms_Windows Services - Fatal编程技术网

C# Windows服务的逻辑&;获取更新

C# Windows服务的逻辑&;获取更新,c#,vb.net,winforms,windows-services,C#,Vb.net,Winforms,Windows Services,我使用vb.net开发了一个Windows服务,它使用OnStart执行以下操作 从SQL表中获取所有条目 从返回的行创建计划 它工作得很好,安排了他们的时间和东西 问题:每当我必须向表中添加新行时,我都必须重新启动服务,以便它可以获取新创建的行。这给我带来了问题…可能有一个任务正在运行,重新启动服务可能会破坏系统 那么,处理这个问题的最佳方法是什么?新行是否可以在不重新启动的情况下加载到服务中 谢谢在数据库中使用轮询的概念。使用System.Threading.Timer类,设置一个调用回

我使用vb.net开发了一个Windows服务,它使用OnStart执行以下操作

  • 从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,可能是轮询。谢谢你纠正我的错误,我总是搞混。