SignalR服务在启动时崩溃

时间:2015-11-05 15:26:25

标签: c# windows service signalr

我刚从前任那里拿到了一个Signal R服务。安装后,它将成功启动和停止。它甚至可能在未能以错误开始之前执行几次

at System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])
   at System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)
   at Microsoft.Owin.Hosting.ServerFactory.ServerFactoryAdapter.Create(Owin.IAppBuilder)
   at Microsoft.Owin.Hosting.Engine.HostingEngine.StartServer(Microsoft.Owin.Hosting.Engine.StartContext)
   at Microsoft.Owin.Hosting.Engine.HostingEngine.Start(Microsoft.Owin.Hosting.Engine.StartContext)
   at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(Microsoft.Owin.Hosting.StartOptions)
   at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(Microsoft.Owin.Hosting.StartOptions)`

我已将错误处理放在任何地方,但此错误未在应用程序中捕获,只是事件日志。

我在服务启动中找到了以下代码:

        using (WebApp.Start<Startup>(this._signalRURL))
        {
            Thread.Sleep(Timeout.Infinite);

        }

该服务启动一个线程,然后永远睡觉!我不知道为什么他会这样做,但我假设有一个很好的理由。我已经删除了thread.sleep行,现在服务运行并且不会抛出错误。

所以,我的问题是:

  • 为什么线程被永远地送去睡觉?
  • 他为什么要使用&#34;使用&#34;声明?

我不想拿出代码,直到我知道它为什么会出现在那里。

1 个答案:

答案 0 :(得分:2)

why is the thread sent to sleep forever?

他正在尝试在当前线程上创建一个长时间运行的线程或消息循环,以避免exit of the main thread。这是一种Application.Run请参阅here以获取更多信息。

因为当您退出using statement时,将丢弃WebApp并且SignalR将不再可用

why is he using a "using" statement?

没有理由使用using语句,因为SignalR旨在运行直到应用程序实例寿命结束

<强>更新

我可以建议的是声明类似IDiposable的var,如下面的

//your windows service
public class RunningInstance : ServiceBase
    { 
       //this will  be outscope of method start and WebbApp will  not disposed 
       static IDisposable signalRApp;
       //and in your onstart   

        protected override void OnStart(string[] args)
        {

             signalRApp=WebApp.Start<Startup>(this._signalRURL);
        }

    }

注意

when you assign your IDisposable to a static field it will be loaded when your type is loaded (ServiceBase in this case), so your object will be disposed when your containing type is unloaded