我有一个测量硬件设备,我想控制一个类。我希望能够启动和停止它并让它在自己的线程中进行测量。因此,宽度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();
}
}
答案 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
,那将是我的首选。
希望这有帮助