全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#多线程之线程控制详解

本文为大家分享了C#多线程之线程控制,供大家参考,具体内容如下

方案一:

调用线程控制方法.启动:Thread.Start();停止:Thread.Abort();暂停:Thread.Suspend();继续:Thread.Resume();

 private void btn_Start_Click(object sender, EventArgs e)
    {
      mThread.Start(); // 开始
    }

    private void btn_Stop_Click(object sender, EventArgs e)
    {
      mThread.Abort(); // 终止
    }

    private void btn_Suspend_Click(object sender, EventArgs e)
    {
      mThread.Suspend(); // 暂停
    }

    private void btn_Resume_Click(object sender, EventArgs e)
    {
      mThread.Resume(); // 继续
    }

线程定义为:

mThread = new Thread(() =>
      {
        try
        {
          for (int j = 0; j < 20; j++)
          {
            int vSum = 0;
            this.textBox1.Text += "--->";
            for (int i = 0; i < 100000000; i++)
            {
              if (i % 2 == 0)
              {
                vSum += i;
              }
              else
              {
                vSum -= i;
              }
            }
            this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
            Thread.Sleep(1000);
          }
        }
        catch (ThreadAbortException ex)
        {
          Console.WriteLine("ThreadAbortException:{0}", ex.Message);
        }
      });

值得注意的是: 通过 Thread.Abort() 停下来的线程(或自行运行结束的线程),都无法直接通过 Thread.Start() 方法再次启动,必须重新创建一个线程启动。

所以,“开始按钮”事件应为:

private void btn_Start_Click(object sender, EventArgs e)
    {
      // 定义线程
      mThread = new Thread(() => // Lambda 表达式
      {
        try
        {
          for (int j = 0; j < 20; j++)
          {
            int vSum = 0;
            this.textBox1.Text += "--->";
            for (int i = 0; i < 100000000; i++)
            {
              if (i % 2 == 0)
              {
                vSum += i;
              }
              else
              {
                vSum -= i;
              }
            }
            this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
            Thread.Sleep(1000);
          }
        }
        catch (ThreadAbortException ex)
        {
          Console.WriteLine("ThreadAbortException:{0}", ex.Message);
        }
      });

      mThread.Start(); // 开始
    }

此外,对于 Thread.Suspend() 和 Thread.Resume() 方法,微软已经将其标记为过时:

Thread.Suspend has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202(Thread.Suspend 已被否决。请使用系统中的其他类线程,如监视器、互斥体、事件和信号量,以同步线程或保护资源。http://go.microsoft.com/fwlink/?linkid=14202)

因为,无法判断当前挂起线程时它正在执行什么代码。如果在安全权限评估期间挂起持有锁的线程,则 AppDoamin 中的其它线程可能被阻止。如果在线程正执行构造函数时挂起它,则 AppDomain 中尝试使用该类的其它线程将被阻止。这样容易发生死锁。

方案二:

在 线程运行过程中 适当的位置(如某个完整的功能/命令后)判断是否要继续线程,再决定线程的命运。

1.定义一个全局变量:

int mTdFlag = 0; // 1:正常运行;2:暂停;3:停止

 2. 定义一个判断方法:

bool WaitForContinue()
    {
      if (this.mTdFlag == 3)
      {
        return false; // 返回false,线程停止
      }
      else if (this.mTdFlag == 2)
      {
        while (mTdFlag != 1)
        {
          Thread.Sleep(200); // 假暂停;停顿时间越短,越灵敏
          if (this.mTdFlag == 3)
          {
            return false; // 返回false,线程停止
          }
        }
      }
      return true; // 返回true,线程继续
    }

3.修改 控制命令 事件:

 private void btn_Stop_Click(object sender, EventArgs e)
    {
      this.mTdFlag = 3;
      //mThread.Abort(); // 终止
    }

    private void btn_Suspend_Click(object sender, EventArgs e)
    {
      this.mTdFlag = 2;
      //mThread.Suspend(); // 暂停
    }

    private void btn_Resume_Click(object sender, EventArgs e)
    {
      this.mTdFlag = 1;
      //mThread.Resume(); // 继续
    }

4.在线程运行过程中适当的位置,判断线程是否继续

 mThread = new Thread(() =>
      {
        try
        {
          for (int j = 0; j < 20; j++)
          {
            int vSum = 0;
            this.textBox1.Text += "--->";
            for (int i = 0; i < 100000000; i++)
            {
              if (i % 2 == 0)
              {
                vSum += i;
              }
              else
              {
                vSum -= i;
              }
              if (i % 10000000 == 0)
              {
                this.textBox1.Text += ".";
              }
              if (!WaitForContinue()) // 返回 false 则,停止
              {
                break;
                //return;
              }
            }
            this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
            if (!WaitForContinue()) // 返回 false 则,停止
            {
              break;
              // return;
            }
            Thread.Sleep(1000);
          }
        }
        catch (ThreadAbortException ex)
        {
          Console.WriteLine("ThreadAbortException:{0}", ex.Message);
          this.textBox1.Text += ex.Message + "...";
        }
        finally
        {
          this.textBox1.Text += "线程已结束";
        }
      });

在窗体中,解决跨线程访问问题:在窗体构造函数中添加代码:  Control.CheckForIllegalCrossThreadCalls = false;


# C#  # 多线程  # 线程控制  # C#多线程基础知识汇总  # C# 多线程编程技术基础知识入门  # 基于C#实现的轻量级多线程队列图文详解  # C#中的多线程小试牛刀  # C#中的多线程超时处理实践方案  # C#多线程之Semaphore用法详解  # C# 文件上传下载(Excel导入  # 多线程下载)功能的实现代码  # C#多线程及同步示例简析  # C#多线程之Thread类详解  # 深入了解c#多线程编程  # 挂起  # 死锁  # 过程中  # 的是  # 信号量  # 已被  # 将其  # 微软  # 请使用  # 将被  # 停下来  # 大家分享  # 具体内容  # 正常运行  # 判断是否  # 全局变量  # 互斥  # gt  # btn_Resume_Click 


相关文章: 宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  如何在云主机上快速搭建网站?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  建站之星上传入口如何快速找到?  如何选择香港主机高效搭建外贸独立站?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  制作网站的公司有哪些,做一个公司网站要多少钱?  Bpmn 2.0的XML文件怎么画流程图  如何在新浪SAE免费搭建个人博客?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  ,怎么用自己头像做动态表情包?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  制作旅游网站html,怎样注册旅游网站?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  建站与域名管理如何高效结合?  电商网站制作价格怎么算,网上拍卖流程以及规则?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何在Ubuntu系统下快速搭建WordPress个人网站?  建站之星伪静态规则如何设置?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  网站微信制作软件,如何制作微信链接?  ,想在网上投简历,哪几个网站比较好?  专业公司网站制作公司,用什么语言做企业网站比较好?  建站上市公司网站建设方案与SEO优化服务定制指南  实例解析Array和String方法  如何快速搭建高效WAP手机网站?  ,在苏州找工作,上哪个网站比较好?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  制作农业网站的软件,比较好的农业网站推荐一下?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  建站之星如何实现PC+手机+微信网站五合一建站?  常州自助建站费用包含哪些项目?  如何在西部数码注册域名并快速搭建网站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何选择PHP开源工具快速搭建网站?  如何通过智能用户系统一键生成高效建站方案?  香港服务器选型指南:免备案配置与高效建站方案解析  香港网站服务器数量如何影响SEO优化效果?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  无锡营销型网站制作公司,无锡网选车牌流程?  创业网站制作流程,创业网站可靠吗?  如何通过宝塔面板实现本地网站访问? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。