C# 如何退出线程?

C# 如何退出线程?,c#,multithreading,C#,Multithreading,因此,我让这个线程继续检查某个程序是否正在运行,这很好,但是当我试图通过将ThreadStatus更改为false来结束它时,它只会继续运行 public bool ThreadStatus = true; public void Run() { while (ThreadStatus) { Thread.Sleep(2000); Process[] nProcess = Process.G

因此,我让这个线程继续检查某个程序是否正在运行,这很好,但是当我试图通过将ThreadStatus更改为false来结束它时,它只会继续运行

    public bool ThreadStatus = true;

    public void Run()
    {
        while (ThreadStatus)
        {
            Thread.Sleep(2000);
            Process[] nProcess = Process.GetProcessesByName(processName);

            if (nProcess.Length > 0)
            {
                if (!nProcess[0].HasExited && ThreadStatus == true)
                {
                    nProcess[0].Kill();
                }
            }
        }
    }

    public void StartThread()
    {
        thread = new Thread(new ThreadStart(this.Run));
        thread.Start();
    }

ThreadStatus
应为
volatile

public volatile bool ThreadStatus=true

volatile关键字提醒编译器多个线程将访问
ThreadStatus
数据成员,因此它不应对此成员的状态进行任何优化假设


ThreadStatus
应为
volatile

public volatile bool ThreadStatus=true

volatile关键字提醒编译器多个线程将访问
ThreadStatus
数据成员,因此它不应对此成员的状态进行任何优化假设


对任务使用取消令牌,而不是中止线程。参考:

在任务上使用取消令牌,而不是中止线程。ref:

让我们打开优化
ThreadStatus
关闭:
public volatile bool ThreadStatus=true终止线程的可能重复从来都不是一个好选项:)~@DmitryBychenko当我切换到
volatile
时,没有任何变化将
while(ThreadStatus)
更改为
while(volatile.Read(ref ThreadStatus))
。不要将字段声明更改为
volatile
。正如Eric Lippert所说:让我们打开
ThreadStatus
关闭优化:
public volatile bool ThreadStatus=true终止线程的可能重复从来都不是一个好选项:)~@DmitryBychenko当我切换到
volatile
时,没有任何变化将
while(ThreadStatus)
更改为
while(volatile.Read(ref ThreadStatus))
。不要将字段声明更改为
volatile
。正如Eric Lippert所说:评论中提到了这一点,OP已经回应了这一点,但它并没有解决问题。评论中提到了这一点,OP已经回应了这一点,但它并没有解决问题