Кто-нибудь может увидеть проблему с тем, как я перенаправляю вывод этих процессов? - PullRequest
1 голос
/ 19 июля 2011

Хорошо, поэтому у меня проблема с многопоточностью.Я создаю экземпляр нового класса «ExecuteThread» и запускаю новый поток, чтобы запустить метод «ThreadProccess» в этой новой ссылке несколько раз асинхронно.Теперь все процессы запускаются, запускаются и заканчиваются асинхронно ОТЛИЧНО.Проблема в том, что мне нужно перенаправить вывод этих процессов.Как только я раскомментирую строку, которая там прокомментирована, все выходит из строя и начинает работать последовательно, возвращая неверные истекшие времена и тому подобное.(Истекшие времена были правильными прежде).И мне нужна эта строка, потому что она хранит выходные данные.Кто-нибудь может увидеть проблему с тем, как я перенаправляю эти выводы?

public class ExecuteThread
{
    private string exePath;
    private string gPath;
    private string filePath;
    private string tPath;

    private Dictionary<string, string> gReference;
    private Entry entry;
    private startNextThread callBackDelegate;
    private ProcessStartInfo startInfo;
    private PInfo pInfo;
    private Process filePExe;

    public ExecuteThread(Entry entry, string exe, Dictionary<string, string> gReference, startNextThread callBack)
    {
        pInfo = new PInfo();
        this.entry = entry;
        this.gReference = gReference;
        exePath = exe;
        callBackDelegate = callBack;

        getPInfo();
        createStartInfo();
        InstantiateProcess();
    }

    private void getPInfo()
    {
        GetGPath();
        filePath = entry.ResolveSourcePath(entry);
        tPath = entry.ResolveArtifactsTagsPath(entry);
    }

    private void GetGPath()
    {
        if (!string.IsNullOrEmpty(entry.fileType))
        {
            if (g.ContainsKey(entry.fileType))
                gPath = gReference[entry.fileType];
                return;        
        }
        gPath = null;
    }

    private void createStartInfo()
    {
        startInfo = new ProcessStartInfo(exePath);
        startInfo.CreateNoWindow = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.UseShellExecute = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.Arguments = gPath + " " + filePath + " " + tPath;
    }

    private void InstantiateProcess()
    {
        filePExe = new Process();
        filePExe.StartInfo = startInfo;
        filePExe.EnableRaisingEvents = true;
    }
    private void Parse()
    {
        try
        {
            this.filePExe.Start();
            this.fileParserExe.WaitForExit();
            //this.pInfo.additionalMessage += filePExe.StandardOutput.ReadToEnd();
            this.filePExe.Close();
        }
        catch (Exception e)
        {
            parseInfo.additionalMessage += e.ToString();
            parseInfo.additionalMessage += "Could not locate single file p executable: " + exePath;
        }

    }

    public void ThreadProcess()
    {
        this.pInfo.fileName = entry.fileName;
        this.pInfo.startTime = DateTime.Now;
        Parse();
        this.pInfo.endTime = DateTime.Now;
        this.pInfo.SetElapsedTime();

        if (this.callBackDelegate != null)
        {
            this.callBackDelegate(this.pInfo);
        }
    }
}

public class PInfo
{
    public string fileName;
    public DateTime startTime;
    public DateTime endTime;
    public string ElapsedTime;
    public string additionalMessage = "";

    public void SetElapsedTime()
    {
        TimeSpan elapsedTime;
        elapsedTime = this.endTime.Subtract(this.startTime);
        ElapsedTime = string.Format("{0:hh\\:mm\\:ss.fff}", elapsedTime); 
    }

}
//How I'm starting each thread
if (entryQueue.Count > 0)
        {
            ExecuteThread eT = new ExecuteThread(entryQueue.Dequeue(), exe, gReference,
                new startNextThread(startNextThread));

            Thread newThread = new Thread(eT.ThreadProcess);
            newThread.Start();
        }

1 Ответ

3 голосов
/ 19 июля 2011

Вы должны поставить строку, которую вы прокомментировали перед звонком на WaitForExit. Для получения дополнительной информации см. Раздел Примечания документации .

.

Кроме того, вы должны использовать класс Секундомер для измерения продолжительности операции. См. Примечания раздел DateTime.Now для получения дополнительной информации.

UPDATE:
Вы можете попробовать использовать асинхронное чтение выходного потока, чтобы увидеть, помогает ли это. Для этого измените свой метод Parse следующим образом:

this.filePExe.OutputDataReceived += 
    (s, e) => this.pInfo.additionalMessage += e.Data + Environment.NewLine;
this.filePExe.Start();
this.filePExe.BeginOutputReadLine();
this.filePExe.WaitForExit();
this.filePExe.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...