Winforms Windows服务无法打开Windows窗体

Winforms Windows服务无法打开Windows窗体,winforms,windows-services,topshelf,Winforms,Windows Services,Topshelf,我正在尝试使用TopShelf创建Windows服务,在此服务中,我想启动Windows窗体。创建服务并调试后,调用ShowDialog该窗体不会显示: 服务 class SimpleServ { private Task task; private const string PATH = @"D:/out.txt"; private Logger logger; private CancellationTokenSource src = new Cancell

我正在尝试使用
TopShelf
创建
Windows服务
,在此服务中,我想启动
Windows窗体
。创建服务并调试后,调用
ShowDialog
该窗体不会显示:

服务

 class SimpleServ {
    private Task task;
    private const string PATH = @"D:/out.txt";
    private Logger logger;
    private CancellationTokenSource src = new CancellationTokenSource();
    public SimpleServ() {
        logger = new Logger();

    }
    public void Start() {

        logger.Log("Started");
        this.task = Task.Run(async () => {

            var fm = new Fm(logger);
            while (true) {
                fm.ShowDialog();
                logger.Log("Just closed the dialog");
                await Task.Delay(3000);
            }
        });
    }
    public void Stop() {
        logger.Log("Stopped service");
    }
}
表格

public partial class Fm : Form {
    private Logger log;
    public Fm(Logger log) {
        this.log = log;
        this.log.Log("From Form constructor");
        InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e) {
        this.log.Log("Button clicked");
        this.Close();
    }
}
Main

class Program {
        static void Main(string[] args) {
            var exitCode = HostFactory.Run(x => {
                x.Service<SimpleServ>(s => {
                    s.ConstructUsing(h => new SimpleServ());
                    s.WhenStarted(h => h.Start());
                    s.WhenStopped(h => h.Stop());
                });
                x.RunAsLocalSystem();
                x.SetServiceName("SimpleService");
                x.SetDisplayName("Simple Service");
                x.SetDescription("Simple serv description");

            });
            int exitCodeValue = (int)Convert.ChangeType(exitCode, exitCode.GetTypeCode());
            Environment.ExitCode = exitCodeValue;
        }
    }
该文件的输出为:

Date:6/12/2019 11:19:13 AM  Message:Started
Date:6/12/2019 11:19:13 AM  Message:From Form constructor

在一个会话0隔离(一种重要的安全防范措施)是法律的世界中,您应该非常仔细地考虑任何依赖于服务交互的设计

最佳做法是重组您的解决方案,使其具有:

  • 在后台运行的服务,独立于 使用者
  • 与服务和服务交互的传统GUI应用程序 可以由任何用户运行

  • 您的表单将不会显示在桌面上,原因是。它可能在会话0上可见。您使用的是什么版本的Windows?有些允许您切换到会话0。我正在使用
    Windows 10
    ,您是对的,此服务必须独立于
    用户运行。它在每台机器上运行一个实例,所以我不可能让一个原子进程运行一个长时间运行的线程和一个
    GUI
    ?在当前场景中,比安全性更重要的是
    GUI
    和另一个
    线程之间的距离。到目前为止,它们是同一进程中的两个
    任务。当然,您可以创建一个原子进程,该进程在启动时启动GUI。Windows没有对此设置任何限制。服务都是关于“长时间运行”的,它们可以愉快地创建窗口和其他GUI元素。但是,当您希望有人在长时间运行的过程中与GUI交互时,就会出现问题。谁应该看到GUI?有人登录吗?只有第一个登录的人?假设第一次登录是通过RDP,他们是否仍能看到GUI?如果第一个人注销,第二个人登录,会发生什么情况?第二个人看到GUI了吗?正如你所看到的,事情变得非常复杂!此外,单进程方法受到一个基本事实的影响:每个进程必须驻留在单个会话中。在会话0(启动时唯一可用的会话)中启动的进程无法在会话1(第一个用户登录时创建的会话)中显示GUI。此限制限制了服务如何与用户交互。
    
    Date:6/12/2019 11:19:13 AM  Message:Started
    Date:6/12/2019 11:19:13 AM  Message:From Form constructor