Windows services Windows服务刚刚停止。无消息、无警报、错误、警告-无

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

我有一个Windows服务,它只会自动停止。以下是相关代码:

OnStart()方法:

OnStop()方法:

InitializeWatchers()方法:

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);
投掷;
}
}
当我运行此代码时,服务将正常启动。事件日志记录三个事件:

  • 服务和日志记录已启动
  • 初始化1个观察者
  • 服务启动已完成
  • 。。。它停止了。我必须手动刷新“服务”窗口,但它停止运行。我没有收到任何错误或任何其他事件日志条目

    令人沮丧的是,这段代码可以完美地作为一个控制台应用程序使用。我已将所有eventLog.WriteEntry()更改为Console.WriteLine(),但除此之外,代码是相同的,并按预期执行


    任何智慧都将不胜感激。

    我怀疑服务控制管理器正在终止您的服务,因为它没有在超时窗口(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;
        }
    }