Поддерживайте приложение Windows в активном состоянии до тех пор, пока процесс не остановится. C# - PullRequest
0 голосов
/ 21 апреля 2020

Я создал консольное приложение и пишу в файл каждые 2 секунды. все работает нормально:

     static void Main(string[] args)
    {
        m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
        m_streamWriter.Write(" File Write Operation Starts : ");
        m_streamWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
        m_streamWriter.WriteLine(" ===================================== \n");
        m_streamWriter.Flush();
        timer1 = new Timer(TimerCallback, null, 0, 2000);
        Console.ReadLine();
    }
    private static void TimerCallback(Object o)
    {
        m_streamWriter.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
            DateTime.Now.ToLongDateString());
        m_streamWriter.Flush();
    }

Но мне нужно, чтобы это работало в фоновом режиме без появления командной строки. Поэтому я изменил тип вывода на «Windows Приложение». Теперь, когда я запускаю его, он записывает первую строку в файл, а затем все. Программа завершается после одной итерации. Таймер, конечно же, также отключается.

Как мне сохранить приложение Windows живым, пока процесс не будет остановлен вручную?

(Примечание) - я не могу выполнить службу windows, и я не знаю никаких других. Net программ, которые могут работать в фоновом режиме. Если кто-нибудь знает один, пожалуйста, поделитесь.

1 Ответ

1 голос
/ 21 апреля 2020

Console.Readline не будет блокировать завершение вашего процесса. В приложении windows для Console.In установлено значение NullStreamReader, что означает, что вызов Console.ReadLine будет возвращаться немедленно, поскольку реализация ReadLine для NullStreamReader просто "return null"

Реализация, приведенная ниже, завершается после него повторяется 1000 раз, но если вы никогда не дадите сигнал об отмене, он будет выполняться бесконечно.

Я уверен, что существуют лучшие реализации, я просто вынул это из головы.

Есть много способов структурировать это, вот один пример:

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    class Program
    {
        [STAThread]
        static void Main()
        {
            CancellationTokenSource cts = new CancellationTokenSource();
            Program instance = new Program(cts);

            Task.Run(() => { instance.MyApp(); });

            while (!cts.Token.IsCancellationRequested)
            {
                Application.DoEvents();
                Thread.Sleep(500);
            };



        }

        private CancellationTokenSource _cts = null;
        public Program(CancellationTokenSource cts)
        {
            this._cts = cts;
        }

        public void MyApp()
        {
            FileInfo fi = new FileInfo(Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\dummydata\test.txt"));
            fi.Directory.Create();
            int i = 0;
            while(i < 1000)
            {
                i++;
                File.AppendAllText(fi.FullName, i + "=" + DateTime.Now.ToString() + "\r\n");
            }
            this._cts.Cancel();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...