线程程序,第一个和最后一个循环除了'Running'之外没有threaddstate

本文关键字:Running threaddstate 第一个 程序 最后一个 循环 线程 | 更新日期: 2023-09-27 18:18:01

我有一个程序,循环x次(10),并使用指定数量的线程(2)。我使用线程数组:

Thread[] myThreadArray = new Thread[2];

我相信,我的循环计数器启动前2个线程很好,但是当它到达循环3时,它回到线程0(从零开始),它挂起。奇怪的是,如果我抛出一个MessageBox.Show()来检查ThreadState(它显示线程0仍在运行),它将继续通过10个循环中的9个。但是如果没有MessageBox.Show(),它在开始第三个循环时挂起。

我正在使用。net 3.5框架(我注意到。net 4.0使用了一种叫做延续的东西…)

下面是一些代码示例:
        Thread[] threads = new Thread[2];
        int threadCounter = 0;
        for (int counter = 0; counter < 10; counter++)
        {
            if (chkUseThreading.Checked)
            {
                TestRunResult runResult = new TestRunResult(counter + 1);
                TestInfo tInfo = new TestInfo(conn, comm, runResult);
                if (threads[threadCounter] != null)
                {
                    // If this is here, then it will continue looping....otherwise, it hangs on the 3rd loop
                    MessageBox.Show(threads[threadCounter].ThreadState.ToString());
                    while (threads[threadCounter].IsAlive || threads[threadCounter].ThreadState == ThreadState.Running)
                        Thread.Sleep(1);
                    threads[threadCounter] = null;
                }
                // ExecuteTest is a non-static method
                threads[threadCounter] = new Thread(new ThreadStart(delegate { ExecuteTest(tInfo); }));
                threads[threadCounter].Name = "PerformanceTest" + (counter + 1);
                try
                {
                    threads[threadCounter].Start();
                    if ((threadCounter + 1) == threadCount)
                        threadCounter = 0;
                    else
                        threadCounter++;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                Application.DoEvents();
            }
        }
            while (true)
            {
                int threadsFinished = 0;
                for (int counter = 0; counter < threadCount; counter++)
                {
                    if (!threads[counter].IsAlive || threads[counter].ThreadState == ThreadState.Stopped)
                        threadsFinished++;
                }
                if (threadsFinished == threadCount)
                    break;
                else
                    Thread.Sleep(1);
            }

显然,问题是关于我如何检查线程#1或#2是否完成。IsAlive总是为true,而ThreadState对于线程循环1和10总是为"running"。

我做错了什么?

更新,这里是ExecuteTask()方法:

        private void ExecuteTest(object tInfo)
    {
        TestInfo testInfo = tInfo as TestInfo;
        Exception error = null;
        DateTime endTime;
        TimeSpan duration;
        DateTime startTime = DateTime.Now;
        try
        {
            if (testInfo.Connection.State != ConnectionState.Open)
            {
                testInfo.Connection.ConnectionString = connString;
                testInfo.Connection.Open();
            }
            testInfo.Command.ExecuteScalar();
        }
        catch (Exception ex)
        {
            error = ex;
            failedCounter++;
            //if (chkCancelOnError.Checked)
            //    break;
        }
        finally
        {
            endTime = DateTime.Now;
            duration = endTime - startTime;
            RunTimes.Add(duration);
            testInfo.Result.StartTime = startTime;
            testInfo.Result.EndTime = endTime;
            testInfo.Result.Duration = duration;
            testInfo.Result.Error = error;
            TestResults.Add(testInfo.Result);
            // This part must be threadsafe...
            if (lvResults.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(ExecuteTest);
                this.Invoke(d, new object[] { tInfo });
            }
            else
            {
                lvResults.Items.Add(testInfo.Result.ConvertToListViewItem());
                #region Update Results - This wouldn't work in it's own method in the threaded version
                const string msPrefix = "ms";
                // ShortestRun
                TimeSpan shortest = GetShortestRun(RunTimes);
                tbShortestRun.Text = shortest.TotalMilliseconds + msPrefix;
                // AverageRun
                TimeSpan average = GetAverageRun(RunTimes);
                tbAverageRun.Text = average.TotalMilliseconds + msPrefix;
                // MeanRun
                TimeSpan mean = GetMeanRun(RunTimes);
                tbMeanRun.Text = mean.TotalMilliseconds + msPrefix;
                // LongestRun
                TimeSpan longest = GetLongestRun(RunTimes);
                tbLongestRun.Text = longest.TotalMilliseconds + msPrefix;
                // ErrorCount
                int errorCount = GetErrorCount(TestResults);
                tbErrorCount.Text = errorCount.ToString();
                #endregion
            }
            testInfo.Command.Dispose();
            Application.DoEvents();
        }
    }

线程程序,第一个和最后一个循环除了'Running'之外没有threaddstate

你可以张贴一个片段的运行()吗?Thread.currentThread().notifyAll()没有帮助吗?可能每个线程都在等待其他线程做一些导致死锁的事情?