Как ждать, пока операция не закончится? - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть код C #, который включает код Python, в котором он запускается через коды CMD в C #.Когда код Python запущен, операции выполняются, создается файл JSON, а затем он открывается в C #.В этой ситуации, как код C # может подождать, чтобы проверить, создан ли вывод Python (data.json) или нет, и только при создании вывода разрешается запуск остальной части кода C #:

Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.Start();
process.StandardInput.WriteLine("F:\\");
process.StandardInput.WriteLine("cd F:\\Path");
process.StandardInput.WriteLine("python Python_Code.py");


process.StandardInput.Flush();
process.StandardInput.Close();
process.WaitForExit();

Затем будут получены сгенерированные данные с помощью Python:

string Output_Python = File.ReadAllText(@"Data.json");
JavaScriptSerializer Ser = new JavaScriptSerializer();
Predicted Output = Ser.Deserialize<Predicted>(Output_Python);

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Вы можете проверить, завершен ли файл data.json при записи в его выходную папку (Код из этого ответа ):

private bool IsFileLocked(FileInfo file) 
{ 
   FileStream stream = null; 
   try 
  { 
    stream = file.Open(FileMode.Open,    FileAccess.ReadWrite, FileShare.None); 
  } 
  catch (IOException)
  { 
//the file is unavailable because it is: 
//still being written to 
//or being processed by another thread 
//or does not exist (has already been processed) 
    return true; 
  }
  finally 
  { 
    if (stream != null) stream.Close(); 
  } 
//file is not locked return 
return false; 
}
0 голосов
/ 24 февраля 2019

Вам не нужно проходить через cmd.exe.Сам интерпретатор Python является исполняемым;другими словами, он может быть запущен и выполнен напрямую.Аргументы для интерпретатора Python (например, путь + имя сценария, который должен быть выполнен) и требуемый рабочий каталог могут быть установлены с помощью соответствующих свойств Process.StartInfo :

Process process = new Process();
process.StartInfo.FileName = "python.exe";
process.StartInfo.Arguments = "Python_Code.py";
process.StartInfo.WorkingDirectory = @"F:\Path";
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.Start();

Теперьвам нужно только дождаться выхода интерпретатора Python (что означает, что он завершил выполнение сценария python)

process.WaitForExit();

и после завершения процесса Python просто проверьте, существует ли файл json / написано:

if (System.IO.File.Exists(pathToJsonFile))
{
    ... do stuff with json file ...
}
else
{
    ... json file does not exist, something went wrong...
}

Примечание: я сохранил process.StartInfo.RedirectStandardOutput = true; в своем примере кода здесь, так как я не знаю, что на самом деле сделает ваша программа.Однако, если ваша программа не хочет обрабатывать вывод сценария, который обычно отображается в окне консоли, установка RedirectStandardOutput в true не требуется.

0 голосов
/ 24 февраля 2019

Вы должны взглянуть на класс FileSystemWatcher.Документация здесь .

Тогда вы можете сделать что-то вроде этого:

using (FileSystemWatcher watcher = new FileSystemWatcher())
{
    watcher.Path = YourDirectory;
    // Watch for changes in LastWrite time
    watcher.NotifyFilter = NotifyFilters.LastWrite;

    // Watch for the wanted file
    watcher.Filter = "data.json";

    // Add event handlers.
    watcher.Created += WhateverYouWantToDo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...