Windows services Windows服务刚刚停止。无消息、无警报、错误、警告-无
我有一个Windows服务,它只会自动停止。以下是相关代码: OnStart()方法: OnStop()方法: InitializeWatchers()方法:Windows services Windows服务刚刚停止。无消息、无警报、错误、警告-无,windows-services,system.reactive,reactive-programming,Windows Services,System.reactive,Reactive Programming,我有一个Windows服务,它只会自动停止。以下是相关代码: OnStart()方法: OnStop()方法: InitializeWatchers()方法: private void InitializeWatchers() { 尝试 { var watchers=_watcherssection.watchers.ToList(); WriteEntry(string.Format(“初始化{0}观察者。”,watchers.Count()); var observathers=watche
private void InitializeWatchers()
{
尝试
{
var watchers=_watcherssection.watchers.ToList();
WriteEntry(string.Format(“初始化{0}观察者。”,watchers.Count());
var observathers=watchers.ToObservable();
obsWatchers.SelectMany(
观察者=>
可观察计时器(watcher.StartTime,TimeSpan.FromHours(watcher.Interval))
.SelectMany(
可观察的.fromsync(
异步()=>新建
{
观察者,
response=wait CheckFolder(watcher.Path)
})))
.订阅(
onNext:x=>
{
eventLog.WriteFormattedEntry(“\n观察者:{0},时间:{1}”,x.watcher.Name,DateTimeOffset.Now);
如果(x.response.Success)
eventLog.WriteFormattedEntry(“|成功!\n |值:'{0}'\n |消息:{0}”,x.response.Value,x.response.Message);
其他的
eventLog.WriteFormattedEntry(“|失败!\n |值:{0}”\n |消息:{0}\n |错误:{0}',x.response.Value,x.response.Message,x.response.Exceptions.First());
},
onError:e=>
{
var-err=e;
var sb=新的StringBuilder();
sb.AppendLine(“观察者抛出了一个错误:”)
.AppendFormatLine(“| Message:{0}”,e.Message);
while(e.InnerException!=null)
{
sb.AppendFormatLine(“|Inner:{0}”,e.InnerException.Message);
e=e.InnerException;
}
(某人);
eventLog.WriteEntry(sb.ToString());
犯错误;
});
WriteEntry(“即将等待”);
观察者。等待();
WriteEntry(“通过了等待”);
}
捕获(例外e)
{
WriteFormattedEntry(“InitializeWatchers(WatchersSection)中引发的异常:{0}”,e.Message);
投掷;
}
}
当我运行此代码时,服务将正常启动。事件日志记录三个事件:
任何智慧都将不胜感激。我怀疑服务控制管理器正在终止您的服务,因为它没有在超时窗口(30秒,IIRC)内从
OnStart
返回
我有一篇关于的博客文章,是基于。请注意,MSDN文档不足;要正确编写托管服务,您必须了解BCL团队博客文章中的信息。而不是使用阻塞并导致Stephen所说问题的
obsWatchers.Wait()
,只需异步订阅即可
将此属性添加到类:
private SingleAssignmentDisposable _subscription = new SingleAssignmentDisposable();
将此添加到您的OnStop
方法中:
_subscription.Dispose();
在InitializeWatchers()
中,消除对Subscribe
的嵌套调用,并将obsWatchers.Wait()
替换为对Subscribe的调用,如下所示:
private void InitializeWatchers()
{
try
{
var watchers = _watcherSection.Watchers.ToList<WatcherElement>();
eventLog.WriteEntry(string.Format("Initializing {0} watchers.", watchers.Count()));
var obsWatchers = watchers.ToObservable();
_subscription.Disposable = obsWatchers
.SelectMany(watcher => Observable
.Timer(watcher.StartTime, TimeSpan.FromHours(watcher.Interval))
.SelectMany(_ => Observable.FromAsync(async () => new
{
watcher,
response = await CheckFolder(watcher.Path)
})))
.Subscribe(
onNext: x =>
{
eventLog.WriteFormattedEntry("\nWatcher: {0}, Time:{1}", x.watcher.Name, DateTimeOffset.Now);
if (x.response.Success)
eventLog.WriteFormattedEntry("| Success!\n| Value: '{0}'\n| Message: {0}", x.response.Value, x.response.Message);
else
eventLog.WriteFormattedEntry("| FAILURE!\n| Value: '{0}'\n| Message: {0}\n| Errors: '{0}'", x.response.Value, x.response.Message, x.response.Exceptions.First());
},
onError: e =>
{
var err = e;
var sb = new StringBuilder();
sb.AppendLine("The observer threw an error:")
.AppendFormatLine("| Message: {0}", e.Message);
while (e.InnerException != null)
{
sb.AppendFormatLine("| Inner: {0}", e.InnerException.Message);
e = e.InnerException;
}
sb.AppendLine();
eventLog.WriteEntry(sb.ToString());
throw err;
});
eventLog.WriteEntry("passed the wait");
}
catch (Exception e)
{
eventLog.WriteFormattedEntry("Exception thrown in InitializeWatchers(WatchersSection): {0}", e.Message);
throw;
}
}
private void InitializeWatchers()
{
尝试
{
var watchers=_watcherssection.watchers.ToList();
WriteEntry(string.Format(“初始化{0}观察者。”,watchers.Count());
var observathers=watchers.ToObservable();
_subscription.Disposable=观察者
.SelectMany(观察者=>可观察
.Timer(watcher.StartTime,TimeSpan.FromHours(watcher.Interval))
.SelectMany(=>Observable.fromsync(async()=>new
{
观察者,
response=wait CheckFolder(watcher.Path)
})))
.订阅(
onNext:x=>
{
eventLog.WriteFormattedEntry(“\n观察者:{0},时间:{1}”,x.watcher.Name,DateTimeOffset.Now);
如果(x.response.Success)
eventLog.WriteFormattedEntry(“|成功!\n |值:'{0}'\n |消息:{0}”,x.response.Value,x.response.Message);
其他的
eventLog.WriteFormattedEntry(“|失败!\n |值:{0}”\n |消息:{0}\n |错误:{0}',x.response.Value,x.response.Message,x.response.Exceptions.First());
},
onError:e=>
{
var-err=e;
var sb=新的StringBuilder();
private SingleAssignmentDisposable _subscription = new SingleAssignmentDisposable();
_subscription.Dispose();
private void InitializeWatchers()
{
try
{
var watchers = _watcherSection.Watchers.ToList<WatcherElement>();
eventLog.WriteEntry(string.Format("Initializing {0} watchers.", watchers.Count()));
var obsWatchers = watchers.ToObservable();
_subscription.Disposable = obsWatchers
.SelectMany(watcher => Observable
.Timer(watcher.StartTime, TimeSpan.FromHours(watcher.Interval))
.SelectMany(_ => Observable.FromAsync(async () => new
{
watcher,
response = await CheckFolder(watcher.Path)
})))
.Subscribe(
onNext: x =>
{
eventLog.WriteFormattedEntry("\nWatcher: {0}, Time:{1}", x.watcher.Name, DateTimeOffset.Now);
if (x.response.Success)
eventLog.WriteFormattedEntry("| Success!\n| Value: '{0}'\n| Message: {0}", x.response.Value, x.response.Message);
else
eventLog.WriteFormattedEntry("| FAILURE!\n| Value: '{0}'\n| Message: {0}\n| Errors: '{0}'", x.response.Value, x.response.Message, x.response.Exceptions.First());
},
onError: e =>
{
var err = e;
var sb = new StringBuilder();
sb.AppendLine("The observer threw an error:")
.AppendFormatLine("| Message: {0}", e.Message);
while (e.InnerException != null)
{
sb.AppendFormatLine("| Inner: {0}", e.InnerException.Message);
e = e.InnerException;
}
sb.AppendLine();
eventLog.WriteEntry(sb.ToString());
throw err;
});
eventLog.WriteEntry("passed the wait");
}
catch (Exception e)
{
eventLog.WriteFormattedEntry("Exception thrown in InitializeWatchers(WatchersSection): {0}", e.Message);
throw;
}
}