C# Считывание вывода процесса в реальном времени, а не в конце жизни процесса - PullRequest
0 голосов
/ 03 августа 2020

Я использую команду .import из sqlite для импорта файла в базу данных. Я создаю Process и выполняю оболочку командной строки sqlite.

Этот процесс выводит строку каждые x вставки, но проблема в том, что событие для OutputDataReceived запускается только в конце получение всех данных сразу. Я хочу добиться, чтобы событие запускалось для каждой строки, записанной в StandardOutput, а не один раз в конце жизненного цикла процесса.

Когда я выполняю команду .\sqlite3.exe .\db.db ".mode csv" ".progress 9" ".separator ," ".import '.\file.csv' table" в cmd, вывод записывается построчно.

Я просмотрел все сообщения stackoverflow с той же проблемой, но не могу найти решения. Большое спасибо!

У меня есть следующий код внутри функции async:

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = GetSQLitePath(),
        Arguments = $"{databasePath} \".mode csv\" \".separator ','\" \".progress {opcodes}\" \".import '{filePath}' '{tableName}'\"",
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        WindowStyle = ProcessWindowStyle.Hidden,
    }
};
process.EnableRaisingEvents = true;
process.ErrorDataReceived += (sender, args) =>
{
    if (args.Data != null)
    {
        result.ErrorMessage = args.Data; //result is the instance of a class that gets returned
        result.Success = false;
        if (!process.HasExited)
            process.Kill();
    }
};
process.OutputDataReceived += (sender, args) =>
{
    Console.WriteLine(args.Data);
    progress.Report(args.Data);
};
await WaitForWriteAccess(databasePath); //checks if the db is locked and if so, it waits
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();

if (!process.HasExited)
    await Task.Run(() => process.WaitForExit());
return result;
...