Служба Windows не может открыть форму Windows - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь создать Windows Service, используя TopShelf, и в рамках этого сервиса я хочу запустить 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 для входа в систему всехважные события и пока, похоже, форма открывается, но я ее не вижу:

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

1 Ответ

1 голос
/ 12 июня 2019

В мире, где Сеанс 0 Изоляция - важная мера безопасности для предотвращения Разрушительных атак - это закон страны, вы должны очень тщательно продумать любой дизайн, основанный на взаимодействии служб.

Рекомендуется реструктурировать решение таким образом, чтобы оно имело:

  1. Службу, которая работает в фоновом режиме, независимо от пользователя
  2. Обычное приложение с графическим интерфейсом, которое взаимодействует си может быть запущен любым пользователем
...