C# 如何在c中关闭来自不同函数的线程#

C# 如何在c中关闭来自不同函数的线程#,c#,multithreading,C#,Multithreading,我正在编写一个通过命令启动和停止线程的应用程序。如果客户端接收到“开始”,它将启动线程,如果客户端接收到“停止”——它将停止。我关心的是我的代码中的线程安全,以及这个问题的正确实践。 我的代码: 问题是中止将不起作用,因为它甚至不知道它是否已启动。另外,我需要知道线程是否真的是活动的。。 也许我需要将它包装在abort语句中,并检查thread.isAlive状态 但我试图做的是为函数创建一个公共变量 bool running = true; Thread thread = new Thread

我正在编写一个通过命令启动和停止线程的应用程序。如果客户端接收到“开始”,它将启动线程,如果客户端接收到“停止”——它将停止。我关心的是我的代码中的线程安全,以及这个问题的正确实践。 我的代码:

问题是中止将不起作用,因为它甚至不知道它是否已启动。另外,我需要知道线程是否真的是活动的。。 也许我需要将它包装在abort语句中,并检查thread.isAlive状态

但我试图做的是为函数创建一个公共变量

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();
}