C# 如何在c中关闭来自不同函数的线程#
我正在编写一个通过命令启动和停止线程的应用程序。如果客户端接收到“开始”,它将启动线程,如果客户端接收到“停止”——它将停止。我关心的是我的代码中的线程安全,以及这个问题的正确实践。 我的代码: 问题是中止将不起作用,因为它甚至不知道它是否已启动。另外,我需要知道线程是否真的是活动的。。 也许我需要将它包装在abort语句中,并检查thread.isAlive状态 但我试图做的是为函数创建一个公共变量C# 如何在c中关闭来自不同函数的线程#,c#,multithreading,C#,Multithreading,我正在编写一个通过命令启动和停止线程的应用程序。如果客户端接收到“开始”,它将启动线程,如果客户端接收到“停止”——它将停止。我关心的是我的代码中的线程安全,以及这个问题的正确实践。 我的代码: 问题是中止将不起作用,因为它甚至不知道它是否已启动。另外,我需要知道线程是否真的是活动的。。 也许我需要将它包装在abort语句中,并检查thread.isAlive状态 但我试图做的是为函数创建一个公共变量 bool running = true; Thread thread = new Thread
bool running = true;
Thread thread = new Thread(doStuff);
...
//wait for the commands
if(command.Equals("start")
{
thread.Start();
}
if(command.Equals("stop")
{
//this code won't work of course
running = false;
}
public void doStuff()
{
while(running)
{
//do stuff
}
}
此实现非常可怕,有时会在15秒内导致崩溃。
有人能告诉我一个合适的方法来实现我的目标吗?谢谢您无法安全或根本无法调用
Thread.Abort()
,这取决于您的框架版本
安全的方法是进行合作取消
以下是方法:
public static void doStuff(CancellationToken ct)
{
while (true)
{
//do stuff
if (ct.IsCancellationRequested)
{
return;
}
}
}
然后这样称呼它:
var cts = new CancellationTokenSource();
Thread thread = new Thread(() => doStuff(cts.Token));
//wait for the commands
if (command.Equals("start")
{
thread.Start();
}
if (command.Equals("stop")
{
cts.Cancel();
}
请注意,
CancellationTokenSource
是一次性的,因此在完成后应该将其处理。更大的问题是,您永远不应该调用thread.Abort()
。您可能会发现这一点很有趣:“我正在编写一个应用程序,它通过命令启动和停止线程”……您已经丢失了。
var cts = new CancellationTokenSource();
Thread thread = new Thread(() => doStuff(cts.Token));
//wait for the commands
if (command.Equals("start")
{
thread.Start();
}
if (command.Equals("stop")
{
cts.Cancel();
}