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隔离(一种重要的安全防范措施)是法律的世界中,您应该非常仔细地考虑任何依赖于服务交互的设计 最佳做法是重组您的解决方案,使其具有:
您的表单将不会显示在桌面上,原因是。它可能在会话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