DateTime UnspecifiedDateTime = DateTime.SpecifyKind(new DateTime(2020, 08, 22, 15, 00, 0), DateTimeKind.Unspecified);
var nzstTz = TimeZoneInfo.FindSystemTimeZoneById("New Zealand Standard Time");
var mskTz = TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time");
var mskTime = TimeZoneInfo.ConvertTime(UnspecifiedDateTime, nzstTz, mskTz);
public class ProcInfo{
public DateTime Start{get; private set;}
public DateTime Stop{get; private set;}
public string Errors{get; private set;}
public string Output{get; private set;}
// .... что то еще
}
var procInfo = new List<ProcInfo>();
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var worker = new Worker();
worker.Start();
Thread.Sleep(1000); // тут можно поставить Console.ReadLine(); и ждать вашего ввода, в общем на ваше усмотрение.
Console.ReadLine();
worker.EmergencyExit();
}
}
public class Worker
{
private const string PythonPath = @"C:/Python/Python38-32/python.exe";
private const string PyScript = @"Load.py";
private const int Interval = 200;
private Thread _thread = null;
private readonly List<ProcInfo> _infos = new List<ProcInfo>();
private void Run()
{
var processInfo = new ProcInfo { Start = DateTime.Now };
var psi = new ProcessStartInfo
{
FileName = PythonPath,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = $"\"{PyScript}\" "/*// опустил для ясности все остальные аргументы*/
};
try
{
using var process = Process.Start(psi);
processInfo.Error = process.StandardError.ReadToEnd();
processInfo.Output = process.StandardOutput.ReadToEnd();
processInfo.Stop = DateTime.Now;
_infos.Add(processInfo);
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
Thread.Sleep(Interval);// эмулируем работу на самом деле у меня ничего не работает
processInfo.Error = e.Message;
processInfo.Stop = DateTime.Now;
_infos.Add(processInfo);
}
var delay = processInfo.Stop - processInfo.Start;
if (delay.TotalMilliseconds < Interval) Thread.Sleep(Interval - (int)delay.TotalMilliseconds); // скрипт отработал быстрее чем нужно ждем
Run(); // перезапускаем себя
}
public void Start()
{
_thread = new Thread(new ThreadStart(Run));
_thread.Start();
}
public void EmergencyExit()
{
_thread?.Abort();
}
}
public class ProcInfo
{
public DateTime Start { get; set; }
public DateTime Stop { get; set; }
public string Output { get; set; }
public string Error { get; set; }
}
}
var process = new Process
{
StartInfo = psi
};
process.OutputDataReceived += (sender, args) => Display(args.Data);
process.ErrorDataReceived += (sender, args) => Display(args.Data);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
var exited = process.WaitForExit(0);
или даже временный файл где все это на самом деле хранитсяне такого
что то подсказывает мне, что есть некая область памятитакое есть, это буффер вашего stdout, но для начала он под капотом системы. если в линуксе, то это одна история, если винде, то абсолютно другая. про винду добавлю - можете погрызть win32 api. с одной стороны гарантированно возможно залезть грязными ручками, даже из шарпа, в буффер stdout. с другой стороны гарантированно придется сильно напрягать мозги (с непривычка, а так то там ни че страшного) и много гуглить. а еще, в процессе такого обучения, наверняка иногда будете ронять систему. я так думаю. ибо если бы вы уже имели опыт общения с win32 api, то вряд ли бы задавали этот вопрос
Я хотел как КРАСИВО! То есть продублировать еще раз, как все, но так чтобы КРАСИВО, как будто я не занимаюсь черти чем, а делаю не как все и весь такой молодец. Понимаете почему?понимаю только что до вас не доходит абсолютно
То есть все таки нет? https://www.opennet.ru/docs/RUS/bash_scripting_gui...то что вы нашли, это перенаправление. я об этом раз пять уже сказал. в винде тоже самое, с небольшими отличиями:
Хм, нашел такая штука ... Оно Linux судя по всему, но суть ясная ... это вообще команда консоли, что судя по всему означает, что надо в "этом состоянии" запуститься ... Хм, мысль интересная ... Пока не выглядит красивым, что жаль.
если у вас выхлоп без диалога, то все просто до отвращения - пишете скрипт, в котором перенаправляете в "куда хочу" выхлоп проги, а уже после ее оокончания, выводите его еще и на экрана потоки ввода вывода, не смотря на различия в исходниках ядер операционнах систем GNU Linix и MS Windosw, иделогочески работают абсолютно одинаково. api разные. но идеология одна. перенаправить выхлоп готовой проги в скрипте элементарно, даже оператор для скриптов одинаковый
>
. но если вы захотите дублировать вывод (а именно так звучит ваш вопрос)Параллельное сохранение файла консоли где я хочу?то придеся лезть в системное программирование. и в Linix и Windosw
Console.WriteLine()
не соизмеримо проще. и в реализации. и в использовании List<MyStruct>
class Item
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime Time { get; set; }
}
var timeTable = new List<Item>
{
new Item { Id = 1, Title = "Иван Сергеевич", Time = DateTime.Parse("20.05.2019 18:45") },
new Item { Id = 2, Title = "Петр Николаевич", Time = DateTime.Parse("20.05.2019 16:45") },
};
var ordered = timeTable.OrderBy(item => item.Time); // Получили IEnumerable<Item> отсортированный по Time
var ordered = from item in timeTable orderby item.Time ascending select item;