Windows 服务无法打开 Windows 表单
Windows Service can not open Windows Form
我正在尝试使用 TopShelf
创建一个 Windows Service
并在此服务中我想启动一个 Windows Form
。在我创建该服务并调试它调用 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();
}
}
主要
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;
}
}
我已将自己附加到该服务,但在它到达 ShowDialog
行后没有任何反应。
更新
我还添加了一个 Logger
来记录所有重要事件,到目前为止,表格似乎已打开,但我看不到它:
记录器
public class Logger {
private string path;
public Logger(string logPath=Constants.PATH) {
this.path = logPath;
}
private object @lock = new object();
public void Log(string message) {
string formattedMessage = "Date:" + DateTime.Now.ToString() + "\tMessage:" + message;
File.AppendAllLines(this.path, new string[] { formattedMessage });
}
}
文件的输出是:
Date:6/12/2019 11:19:13 AM Message:Started
Date:6/12/2019 11:19:13 AM Message:From Form constructor
在 Session 0 Isolation —— 防止 Shatter attacks 的重要安全措施 —— 成为国法的世界中,您应该非常仔细地考虑依赖于服务交互的任何设计。
最佳做法是重组您的解决方案,使其具有:
- 一项 运行 在后台运行的服务,独立于
用户
- 与服务交互的传统 GUI 应用程序和
任何用户都可以运行
我正在尝试使用 TopShelf
创建一个 Windows Service
并在此服务中我想启动一个 Windows Form
。在我创建该服务并调试它调用 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();
}
}
主要
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;
}
}
我已将自己附加到该服务,但在它到达 ShowDialog
行后没有任何反应。
更新
我还添加了一个 Logger
来记录所有重要事件,到目前为止,表格似乎已打开,但我看不到它:
记录器
public class Logger {
private string path;
public Logger(string logPath=Constants.PATH) {
this.path = logPath;
}
private object @lock = new object();
public void Log(string message) {
string formattedMessage = "Date:" + DateTime.Now.ToString() + "\tMessage:" + message;
File.AppendAllLines(this.path, new string[] { formattedMessage });
}
}
文件的输出是:
Date:6/12/2019 11:19:13 AM Message:Started
Date:6/12/2019 11:19:13 AM Message:From Form constructor
在 Session 0 Isolation —— 防止 Shatter attacks 的重要安全措施 —— 成为国法的世界中,您应该非常仔细地考虑依赖于服务交互的任何设计。
最佳做法是重组您的解决方案,使其具有:
- 一项 运行 在后台运行的服务,独立于 用户
- 与服务交互的传统 GUI 应用程序和 任何用户都可以运行