Преобразовать простой c# консоль>услуги для выполнения повторных вызовов API и файловую систему действий


Я был послан сюда из StackOverflow, как было указано, что качество моего нынешнего подхода может быть очень сомнительным. Я пытаюсь преобразовать простое консольное приложение, так что он может быть использован в качестве сервиса с помощью вложенного Service класс (код ниже). Намерение состоит в том, чтобы создать службу для выполнения действий в рамках Run способ более или менее регулярно. Я новичок в .Чистая, поэтому, пожалуйста, голые со мной, если есть явные изъяны в реализации.

Короче говоря, службы OnStart звонки мои собственные Start метод один раз, что создает таймер. Внутри таймера, я создаю экземпляр Program класс, и выполнение Run способ до его завершения. Я считаю, что это действительное осуществление, что я хочу, не оставляет ресурсов выдающийся, хотя я не уверен, должен ли я распоряжаться Prg объект в конце CallTimer. Часть того, что Run метод-это создать словарь действий в файловой системе, которые были неудачными, так что они могут быть попытки снова в следующий раз.

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

partial class Program{
    static object timerLck = new object();

    public class Service : ServiceBase{
        public Service(){
            ServiceName = Program.ServiceName;
        }
        protected override void OnStart(string[] args){
            Program.Start(args);
        }
        protected override void OnStop(){
            Program.Stop();
        }
    }

    static void Main(string[] args){
        if (!Environment.UserInteractive)
            using (var service = new Service())
                ServiceBase.Run(service);
        else{
            Start(args);
            Stop();
        }
    }

    private static void Start(string[] args){
        Timer t = new Timer(CallTimer, null, 0, 50000);
        Console.ReadKey();
    }

    private static void Stop(){
        //log service stopped
    }

    static void CallTimer(object state){
        bool Lock = false;
        Dictionary<string, Metadata> PreviousErrors = new Dictionary<string, Metadata>();
        try{
            Lock = Monitor.TryEnter(timerLck);
            if (Lock){
                Program Prg = new Program()
                var task = Task.Run(()=>Prg.Run(PreviousErrors));
                PreviousErrors = task.Result;
            }
        }
        finally{
            if (Lock) Monitor.Exit(timerLck);
        }
    }

    //Perform the repeated actions here 
    private async Task<Dictionary<string, Metadata>> Run(Dictionary<string, Metadata> previousErrors){
        Dictionary<string, Metadata> d = new Dictionary<string, Metadata>();
        //...            
        return d;
    }
}


126
2
задан 8 февраля 2018 в 09:02 Источник Поделиться
Комментарии