我想c#在线程安全方面有问题
本文关键字:方面 有问题 安全 线程 我想 | 更新日期: 2023-09-27 18:02:20
大家好,我有几个问题,为什么这些事情正在发生。首先,我有初始启动的进程,无论您设置nummofasynchex等于多少。这应该启动两个不同的线程与ExecuteThread类的两个不同的实例,并有两个相同的方法(ThreadProcess),但有不同的变量正确吗?
int numOfAsynchEx = 2;
for (int i = 0; i < numOfAsynchEx; i++)
{
if (entryQueue.Count > 0)
{
ExecuteThread eT = new ExecuteThread(entryQueue.Dequeue()
new startNextThread(startNextThread));
Thread newThread = new Thread(eT.ThreadProcess);
newThread.Start();
metrics.TotalAttempted++;
metrics.ThreadsRunning++;
}
}
这是同一个类中的回调方法:
private void startNextThread(ParsingInfo info)
{
metrics.ThreadsRunning--;
if (entryQueue.Count > 0)
{
metrics.TotalAttempted++;
ExecuteThread eT = new ExecuteThread(entryQueue.Dequeue()
new startNextThread(startNextThread));
Thread newThread = new Thread(eT.ThreadProcess);
newThread.Start();
metrics.ThreadsRunning++;
}
else if(metrics.ThreadsRunning == 0)
{
ThreadsDone = true;
}
}
EDIT这是执行线程类公共类ExecuteThread{
private CatalogEntry entry;
private startNextThread callBackDelegate;
private ProcessStartInfo startInfo;
private ParsingInfo parseInfo;
public ExecuteThread(CatalogEntry entry, startNextThread callBack)
{
parseInfo = new ParsingInfo();
this.entry = entry;
callBackDelegate = callBack;
createStartInfo();
InstantiateProcess();
}
private void createStartInfo()
{
startInfo = new ProcessStartInfo(exePath);
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
//startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = + filePath + " " ;
}
private void InstantiateProcess()
{
fileParserExe = new Process();
fileParserExe.StartInfo = startInfo;
fileParserExe.EnableRaisingEvents = true;
}
private void Parse()
{
try
{
this.fileParserExe.Start();
this.fileParserExe.WaitForExit();
parseInfo.additionalMessage += fileParserExe.StandardOutput.ReadToEnd();
}
catch (Exception e)
{
parseInfo.additionalMessage += e.ToString();
parseInfo.additionalMessage += "Could not locate single file parser executable: " + exePath;
}
}
public void ThreadProcess()
{
this.parseInfo.fileName = entry.fileName;
this.parseInfo.startTime = DateTime.Now;
Parse();
this.parseInfo.endTime = DateTime.Now;
this.parseInfo.SetElapsedTime();
if (this.callBackDelegate != null)
{
this.callBackDelegate(this.parseInfo);
}
}
}
由于某种原因,这不是同时启动两个线程并异步执行它们。它一次只做一个。我不明白为什么。有人能开导我吗?
EDIT:在使用它一段时间后,当我注释掉redirectStandardOutput和useShellExecute时,程序像以前一样完美地工作。我现在的问题是如何重定向输出因为我显然不能那样做?
只是几个建议…
- 你的entryQueue是什么?普通队列{T}不是线程安全的。 你有一个潜在的竞争条件,因为entryQueue。数和entryQueue.Dequeue()不会自动一起完成。
- 你可能想使用互锁。而是递增和递减