【问题标题】:Explain why "using" won't work in service?解释为什么“使用”在服务中不起作用?
【发布时间】: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 方法中对其进行处置

标签: c# signalr using


【解决方案1】:

您的服务出了什么问题?

您遇到的问题是您的Console.ReadLine 会阻塞等待标准输入。这将在 Windows 服务上永久阻塞,并导致服务控制管理器在 30 秒后超时服务启动。 This question 有更多关于正在发生的事情的信息。

如果您删除 using 语句的全部内容,并且语句本身就像您所做的那样,由 WebApp.Start 启动的服务器将在您的服务 Start 方法完成后继续在后台运行。这是服务的正确行为。

您在这里有效地做的是泄漏WebApp.Start 创建的异步工作者。这意味着在服务启动完成后它们仍在运行以侦听请求。

您可能应该跟踪WebApp.Start 返回的IDisposable,并在Stop 方法中处理它。

using 呢?

using statement 确保在控制离开 using 语句块时始终释放资源。这可能是由于引发了异常,也可能是因为块成功完成并且控制转移到程序的下一部分。

using 语句用于当您知道在块完成后没有人想要访问资源时。当您处理向您返回 IDisposable 的方法时,通常会出现这种情况。但是,在您的情况下,您不想调用 dispose,因为您希望 WebApp.Start 创建的线程在服务启动后继续运行。

【讨论】:

    【解决方案2】:

    Webapp.Start 启动工作线程。即使在 HelloWorld.cs 中的代码执行完毕后,这些线程也会让您的 exe 继续运行。在停止所有工作线程之前,您的 exe 不会关闭。

    当您添加“使用”语句时,框架将在您的 SignalR 应用程序上调用 Dispose。此调用将停止所有工作线程,并且您的 exe 将终止。

    Readline() 语句阻止应用程序到达 using 语句的末尾。这意味着在您按下回车之前不会调用 dispose 方法。

    因此,对于一个 exe,您通常希望按照自己的方式使用 ReadLine。 对于要存储对 IDisposable 的引用的服务,并在 Stop() 方法中对其调用 dispose。

    【讨论】:

      猜你喜欢
      • 2020-07-02
      • 2014-12-08
      • 2020-12-27
      • 2012-10-10
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      相关资源
      最近更新 更多