线程不会作为受控的分离线程运行

时间:2018-02-05 10:42:00

标签: c# windows multithreading

我有一个测量硬件设备,我想控制一个类。我希望能够启动和停止它并让它在自己的线程中进行测量。因此,宽度2按钮我可以开始和停止采样测量,因此我创建了MeasurementsStart()和MeasurementsStop()都是从2个按钮调用。

当我在函数TakeMeasurements()内部结束时 width WorkThread.Abort();
VS2017,表示并非所有代码路径都返回一个值。

当我结束它的宽度“抛出新的NotImplementedException”时,代码确实编译它运行但是当我按下MeasurementsStart按钮然后工作线程继续运行,尽管程序的其余部分冻结。

我不清楚如何结束此功能以获得此启动/停止行为。

此处使用随机数替换了实际测量的代码。

   Public static Class Measure
   {
        public static List<double> Samples;
        private static Thread workThread;
        private static volatile bool stopThread = false;


        public static void MeasurementsStop()
        {
            if (workThread != null)
            {
                stopThread = true;
                workThread.Join(); // pauses till Thread exits.
                workThread = null;
            }
        }

        public static void MeasurementsStart()
        {
            Samples = new List<double>();
            if (workThread == null)
            {
                stopThread = false;
                workThread = new Thread(new ThreadStart(TakeMeasurements()));
                workThread.IsBackground = true;
                workThread.Start();
            }
        }

        private static ThreadStart TakeMeasurements()
        {
            while (!stopThread )
            {System.Console.Beep(200, 200);
               Samples.Add(new Random().Next(int.MinValue, int.MaxValue));
              System.Console.Beep(400, 200);
            }
           workThread.Abort();
           //   throw new NotImplementedException();
        }
}

1 个答案:

答案 0 :(得分:1)

你的问题不是取消线程,而是你在主线程上运行TakeMeasurements()函数。

在你的第workThread = new Thread(new ThreadStart(TakeMeasurements()));行中,你调用你的TakeMeasurements函数(因为它的末尾有括号),而不是传递对该函数的引用作为开始的地方新线程。

更改TakeMeasurements函数签名以返回void(因为它没有返回),然后更改

workThread = new Thread(new ThreadStart(TakeMeasurements()));

workThread = new Thread(new ThreadStart(TakeMeasurements));

(注意没有括号)。

至于取消TakeMeasurements线程(并假设你正在使用TCP的阻塞方法),你有两种方法。 你可以:

  • 对阻止呼叫设置超时,以便线程定期唤醒以检查stopThread
  • 使用CancellationToken,只要您的阻止呼叫支持接受CancellationToken作为参数。

两者都有效,但结构不同。如果您使用的阻止方法支持CancellationToken,那将是我的首选。

希望这有帮助