Служба Windows (в C #), которая может вызывать сценарий Python, который работает бесконечно? - PullRequest
0 голосов
/ 17 октября 2018

Из того, что я понимаю, когда вы запускаете службу 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();
    }
}

1 Ответ

0 голосов
/ 17 октября 2018

Хотя могут быть и другие проблемы, первая из них заключается в том, что учетная запись локальной службы, с которой работает ваша служба (вероятно), не имеет разрешений на местоположение C:\Users\bakere1\A19149\Projects\

Если вы измените «Выполнить»Как «учётная запись к чему-то с разрешениями», вы получите дальше.Я не большой фанат Python, но если ваше py-приложение требует какого-либо пользовательского ввода-вывода, оно завершится неудачей, поскольку ему не назначен сеанс консоли.

Кроме того, если у вас есть перемещаемые профили,служба запускается до того, как папка пользователя становится доступной, поэтому она зависает или перестает работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...