是否有更简单的方法来单步执行代码,而不是通过Windows服务控制管理器启动服务,然后将调试器附加到线程?这有点麻烦,我想知道是否有一个更简单的方法.
我正在考虑编写一个Windows服务,它将在用户指定的时间打开或关闭某个功能(使用我将提供的配置实用程序).基本上,用户将指定PC将进入"仅工作"模式(阻止Facebook和其他分散注意力的站点)的某些时间,然后当这些时间到来时,PC将返回到正常模式.
我已经想出了一些方法来创建"仅限工作"模式,但我正在努力的是如何知道何时进出该模式.我真的不想使用线程和计时器,如果我可以避免它,因为这似乎会产生大量的开销,所以我正在寻找的将是某种方式:
有谁知道最好的方法吗?
我知道这是一个已被问到的问题,但我找不到任何解决方案.这是我的服务.
class Program : ServiceBase
{
private Timer _timer;
public Program()
{
ServiceName = "PrintTime";
}
static void Main(string[] args)
{
Run(new Program());
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
_timer = new Timer(5000);
_timer.Elapsed += _timer_Elapsed;
_timer.Start();
}
void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
WriteTimeToFile();
}
protected override void OnStop()
{
_timer.Stop();
}
private void WriteTimeToFile()
{
using (FileStream fs = new FileStream(@"d:\mylog.txt", FileMode.Append, FileAccess.ReadWrite))
{
StreamWriter streamWriter = new StreamWriter(fs);
streamWriter.Write(DateTime.Now.ToShortTimeString());
streamWriter.Close();
fs.Close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我想每隔5秒写入 …
当通过服务控制管理器运行时,Windows服务需要假设可以在不同的线程上调用命令处理方法(OnStart,OnStop等),而不确保例如在方法之间可以看到成员的分配吗?
public class MyService : ServiceBase {
private Object _foo;
protected override void OnStart(string[] args) {
_foo = new Object();
}
protected override void OnStop() {
if (_foo == null) {
throw new Exception("Assignment not visible"); // Can this happen?
}
_foo = null;
}
}
Run Code Online (Sandbox Code Playgroud)
我无法保证我的示例中的异常不会被抛出,但我发现的所有示例(包括StackOverflow上的其他示例)似乎都假设,例如,OnStart()中变量的赋值将始终在OnStop()中可见.
如果SCM没有做出这样的保证,我就知道如何确保分配是可见的(例如,通过在服务中的所有读/写周围添加一个锁).我对这些措施是否必要感兴趣.
我试图在Windows服务中使用计时器.该服务能够启动和停止,当这种情况发生时,我会在事件日志中写入内容,这是有效的.我的问题是我还想使用一个持续运行的计时器,并在每次触发timeElapsed事件时向事件日志写入内容.
编辑:(我更改了代码,所以计时器是一个字段,但仍然不是我期望的结果,事件日志中没有日志条目)
using System.Timers;
Run Code Online (Sandbox Code Playgroud)
初始化服务:
public Timer timer;
public MonitorService()
{
InitializeComponent();
timer = new Timer(10000);
//Some code that really doesn't matter
}
Run Code Online (Sandbox Code Playgroud)
开始活动
protected override void OnStart(string[] args)
{
// Hook up the Elapsed event for the timer.
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Enabled = true;
timer.Start();
EventLogger.WriteEntry("Biztalk monitoring service started", EventLogEntryType.SuccessAudit);
// If the timer is declared in a long-running method, use
// KeepAlive to prevent garbage collection from occurring
// before the method ends.
// GC.KeepAlive(timer);
} …Run Code Online (Sandbox Code Playgroud) 我有一个Windows服务来完成后台进程.这个Windows服务将与asp.net网站互动.功能如下.
在我的网站上有3个动作.用户可以选择任务(假设有三个按钮).然后它将调用Windows服务.其余操作由Windows服务执行.用户可以从网站注销,但它将在后台运行该服务.一旦完成,它将在数据库中进行相应的更改.我需要知道是否可以将任何设计模式应用于Windows服务(工厂,抽象工厂等).我已经阅读了不同的设计模式,但我对这如何应用于项目感到困惑.目前我在Windows服务的'OnStart'和'OnStop'事件中编写完整的代码.请指导我.
谢谢.