Хорошо, поэтому у меня проблема с многопоточностью.Я создаю экземпляр нового класса «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();
}