Из того, что я понимаю, когда вы запускаете службу Windows, она вызывает onStart () и говорит, что служба запускается в диспетчере задач до тех пор, пока метод onStart () не пройдет полностью, к чемуЗатем он говорит «работает».Я хотел бы создать поток для запуска рекламного скрипта Bluetooth (написанного на Python3), который будет непрерывно рекламироваться, когда он не подключен к устройству.Когда я пытаюсь создать поток и запустить сценарий, служба обычно отображает «запуск» в диспетчере задач и никогда не говорит «работает», потому что поток, который я вызываю в «onStart ()» для запуска сценария, никогда не завершается.Я предполагаю. Есть ли способ запустить службу, только начиная поток после того, как он завершил выполнение onStart ()??
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Timers;
using System.Threading;
using System.Security.Permissions;
namespace WindowsService1
{
//--------------------------------------------------------------------------------------------------------------------------------------------------
public partial class Service1 : ServiceBase
{
//-------------------------------------------------------------------------
public Service1() { InitializeComponent(); }
//-------------------------------------------------------------------------
private Boolean _started;
public event System.EventHandler serviceChanged;
Service1 serv = new Service1();
static ThreadStart start = new ThreadStart(Adv_Py_Script);
Thread Adv_Py_ScriptThread = new Thread(start);
//Start_Adv s = new Start_Adv();
//Thread thread1 = new Thread(new ThreadStart(s.Adv_Py_Script));
//-------------------------------------------------------------------------
protected override void OnStart(string[] args)
{
isStarted = true;
Thread.Sleep(5000);
}
//-------------------------------------------------------------------------
protected virtual void onServiceChanged() { serviceChanged?.Invoke(this, EventArgs.Empty); }
//-------------------------------------------------------------------------
public Boolean isStarted
{
get { return _started; }
set
{
_started = value;
onServiceChanged();
}
}
//-------------------------------------------------------------------------
protected override void OnStop()
{
isStarted = false;
serv.killPyThread(Adv_Py_ScriptThread);
base.OnStop();
// wait for threads to stop
Adv_Py_ScriptThread.Join(60);
try
{
string error = "";
// Messaging.SMS.SendSMSTextAsync("5555555555", "Messaging Service stopped on " + System.Net.Dns.GetHostName(), ref error);
}
catch
{
// yes eat exception if text failed
}
}
//-------------------------------------------------------------------------
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
public void killPyThread(Thread thread)
{
thread.Interrupt();
thread.Abort();
}
//-------------------------------------------------------------------------
private static void Adv_Py_Script()
{
string fileName = @"C:\Users\bakere1\A19149\Projects\BLE_Advertiser.py";
Process p = new Process();
p.StartInfo = new ProcessStartInfo(@"C:\Python36_64\python.exe", fileName)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
p.Start();
}
}