Member 12386982 Ответов: 2

Могу ли я вызвать метод windows form в классе службы windows


Я хочу вызвать метод windows form в службе windows.. я использую следующий код

Что я уже пробовал:

Form1 frm = new ScheduleService.Form1();
        public Service1()
        {
            InitializeComponent();
        }
        Process p = new Process();
        protected override void OnStart(string[] args)
        {
            WriteToFile("Service is started at " + DateTime.Now);//used for just checking
            time.Elapsed += new ElapsedEventHandler(OnElapsedTime);
            time.Interval = 8000;
            time.Start();
            time.Enabled = true;
        }
        public void WriteToFile(string Message)
        {
            string path = "D:\\ErrorLogs";
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            string filepath = "D:\\ErrorLogs\\Log_" + DateTime.Now.Date.ToShortDateString().Replace('/', '_') + ".txt";
            if (!File.Exists(filepath))
            {
                // Create a file to write to.   
                using (StreamWriter sw = File.CreateText(filepath))
                {
                    sw.WriteLine(Message);
                }
            }
            else
            {
                using (StreamWriter sw = File.AppendText(filepath))
                {
                    sw.WriteLine(Message);
                }
            }
        }
        private void OnElapsedTime(object sender, ElapsedEventArgs e)
        {
           
            try
            {
                frm.notifyIcon1.ShowBalloonTip(5);
                frm.ReadXML();
                WriteToFile("Service is Running at " + DateTime.Now);
            }
            catch
            {
                WriteToFile("Service is catch error at " + DateTime.Now);
            }
            
        }



сервис работает..но метод, который я вызываю, не работает

2 Ответов

Рейтинг:
1

Chris Copeland

Я не верю, что Windows поддерживает создание и отображение окон из служб. Службы предназначены для фоновых процессов без взаимодействия с пользовательским интерфейсом, и любые созданные вами окна не будут отображаться на экране (на самом деле, я считаю, что Windows использует отдельный сеанс для размещения любого пользовательского интерфейса, созданного из служб, чтобы предотвратить их вмешательство в работу текущего пользователя).

Вместо этого вам следует рассмотреть возможность открытия вашей формы отдельно (и, следовательно, размещения в текущем сеансе) и использовать межпроцессные коммуникационные платформы, такие как WCF, именованные каналы или даже сокеты для передачи данных. Вы также можете рассмотреть возможность записи данных в файл файловой системы (реализуя соответствующую блокировку файлов) и попросить форму прочитать этот файл для обработки любых операций пользовательского интерфейса.

ФОС[^]
именованный канал[^]


Рейтинг:
0

OriginalGriff

Вы можете вызывать методы в любом EXE или DLL из службы, просто ссылаясь на EXE или DLL, как обычно, но ... они не могут взаимодействовать с пользователем каким-либо образом, формой или формой: ни клавиатуры, ни мыши, ни дисплея вообще.

Таким образом, вы не можете создать экземпляр формы и ожидать, что пользователь увидит его, Хотя вы можете вызывать методы в классе Form.

Если вы хотите взаимодействовать с пользователем, вам нужно отдельное приложение, работающее под этой учетной записью пользователя, которое взаимодействует со службой и отображает информацию по мере необходимости - служба не может запустить приложение!