我想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时,程序像以前一样完美地工作。我现在的问题是如何重定向输出因为我显然不能那样做?

我想c#在线程安全方面有问题

只是几个建议…

  • 你的entryQueue是什么?普通队列{T}不是线程安全的。
  • 你有一个潜在的竞争条件,因为entryQueue。数和entryQueue.Dequeue()不会自动一起完成。
  • 你可能想使用互锁。而是递增和递减