【发布时间】:2015-12-23 18:15:12
【问题描述】:
所以我被这个问题困扰了大约一个星期。我试图运行一个项目来接收 TCP 连接并启动 SignalR Hub 作为服务。两者都可以完美地将项目作为 .exe 文件运行。 TCP 部分可以完美运行,但是 SignalR 端出现问题。
原因最终是 using 语句。
之前
using (WebApp.Start<SignalrStartup>(url))
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Server running on {0}", url); // was url
Console.WriteLine("ID\tMessage");
Console.ReadLine();
}
之后
WebApp.Start<SignalrStartup>(url);
我曾尝试在注释掉 Console.WriteLine() 的情况下运行代码,因为我认为它可能会引发异常,因为没有控制台可以输出一次作为服务运行。这也不起作用,但也不能作为 .exe 文件工作,因为它需要Console.ReadLine() 来保持控制台打开,就像你需要它来保持 HelloWorld.cs 打开。一旦 using 包装与 console 一起被删除,它就可以在 .exe 和服务中工作。
我读过 using 语句会在您离开包装器后杀死其中的对象。但我不明白 After 位代码如何使 .exe 代码在运行后保持打开状态。使用 using 有什么意义还是我用错了?
编辑
protected override void OnStart(string[] args)
{
Task.Factory
.StartNew(() => StartTCP())
.ContinueWith(t => StartSignalR());
}
正在通过StartSignalR() 方法进行调用。
【问题讨论】:
-
您在服务的哪个部分创建这个?在服务中,您不能像在控制台应用程序中那样阻止启动方法。如果 ReadLine 没有阻塞,那么 dispose 将被调用。将 IDisposable 保存为成员并在 Stop 方法中对其进行处置