我刚从前任那里拿到了一个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行,现在服务运行并且不会抛出错误。
所以,我的问题是:
我不想拿出代码,直到我知道它为什么会出现在那里。
答案 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