zoukankan      html  css  js  c++  java
  • c#无限循环线程如何正确退出

    在主程序将要结束时,迅速正确退出无限循环执行的子线程。一般子线程循环执行会有一个指定的周期,
    在子线程等待(或者睡眠)时,无法唤醒退出,尤其在执行周期较长时,子线程无法即刻退出,导致
    程序无法迅速关闭。

    1. 定义AutoReset

    private AutoResetEvent exitEvent;
    exitEvent = new AutoResetEvent(false);

    此事件作为线程即将退出的信号,初始化为false。

    2. 定义线程循环周期(睡眠周期)

    int waitTime;

    3. 定义线程执行

    private void Process()
    {
        while (true)
        {
            Console.WriteLine("do some thing");
            if (exitEvent.WaitOne(waitTime))
            {
                break;
            }
        }
    }

    在执行函数每次均等待退出信号若干时间,若没有退出信号则继续执行,若收到退出信号则立即退出。
    可以避免使用sleep长时间睡眠无法立即退出。

    4. 定义线程退出方法

    public void Stop()
    {
        exitEvent.Set();
        thread.Join();
    }

    全部代码

    线程类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace threadexit
    {
        class ThreadA
        {
            private AutoResetEvent exitEvent;
            private Thread thread;
            private int waitTime;
            public ThreadA(int time)
            {
                exitEvent = new AutoResetEvent(false);
                waitTime = time;
                thread = new Thread(new ThreadStart(Process));
            }
            public void Run()
            {
                thread.Start();
            }
            public void Stop()
            {
                exitEvent.Set();
                thread.Join();
            }
            private void Process()
            {
                while (true)
                {
                    Console.WriteLine("do some thing");
                    if (exitEvent.WaitOne(waitTime))
                    {
                        break;
                    }
                }
            }
        }
    }

    主函数

    static void Main(string[] args)
    {
        var t = new ThreadA(3000);
        t.Run();
        System.Threading.Thread.Sleep(10000);
        Console.WriteLine(DateTime.Now.ToShortTimeString() + "begin stop thread");
        t.Stop();
        Console.WriteLine(DateTime.Now.ToShortTimeString() + "thread stoped");
        Console.ReadKey();
    }
  • 相关阅读:
    交换机工作原理
    MyBatis框架的使用及源码分析(一) 配置与使用
    MySQL5.6安装步骤
    mysql创建用户,并授权
    命令行访问远程mysql数据库
    [mybatis] mybatis错误:Invalid bound statement (not found)
    【大数据】每秒十万笔交易的数据架构解读
    【mybaits】Mybatis中模糊查询的各种写法
    【redis】 linux 下redis 集群环境搭建
    [linux] linux下编译安装zlib
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/9232307.html
Copyright © 2011-2022 走看看