C#多线程创建及线程的同步

需求:有时为了能分时的调用多个任务运行,因此需要考虑多线程的编程方式

操作步骤如下:

1)创建线程并开启线程

cs 复制代码
Thread thread0 = new Thread(() => DoWork0(0));
thread0.Start();

2)编写线程函数

cs 复制代码
 static void DoWork0(int threadNumber)
{

  while (true)
  {
    lock (_lock)
      {
         //停止线程
         xx
      }

     Thread.Sleep(4000); // 模拟工作
    }

    Console.WriteLine($"线程 {threadNumber} 完成工作。");
  }

3)等待线程结束

cs 复制代码
 thread0.Join();

有时可以在线程函数中编写死循环,但是需要考虑怎样退出。

当在该线程函数内执行sleep函数时,线程将会切换到下一个线程运行。

4)创建线程1

cs 复制代码
Thread thread1 = new Thread(() => DoWork1(0));
thread1.Start();

5)线程1的函数

cs 复制代码
 static void DoWork1(int threadNumber)
{

  while (true)
  {
    lock (_lock)
      {
         //停止线程
         xx
      }

     Thread.Sleep(4000); // 模拟工作
    }

    Console.WriteLine($"线程 {threadNumber} 完成工作。");
  }

为了能够终止线程运行。

可以采用共享变量控制线程的退出操作:

也即是将上述的线程函数的while(true)函数更改为:while (!_shouldStop)。

然后定义一个全局变量

cs 复制代码
pubulic static  volatile bool _shouldStop;

线程停止函数为:

cs 复制代码
public void RequestStop()
{
    _shouldStop = true;
}

为了保证线程函数运行时不会被其它线程干扰,可以加入线程锁,例如线程函数的所加的lock函数:

cs 复制代码
public static readonly object _lock = new object();
cs 复制代码
 lock (_lock)
 {
    //停止线程
         xx
}
相关推荐
寂寞的船19 分钟前
【Unity知识速递】第13期 Unity 内存泄漏排查实战:从 Memory Profiler 到 Lua 引用泄漏的生产级全链路诊断
unity·junit·c#·游戏引擎·lua
Funlang1 小时前
龙芯上的 Fun:从跑起来到机器码
开发语言·龙芯
总要学点什么1 小时前
第104篇:三维特效-流动墙体效果——让贴图沿墙流动,它却只肯走一条对角线
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
旖旎夜光1 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu2 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
普通人62 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
꧁细听勿语情꧂3 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
SomeOtherTime3 小时前
Rust集合(AI回答)
开发语言·后端·rust
曦樂~3 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript
郝学胜-神的一滴3 小时前
LangChain Skill 实现(渐进披露 On-Demand Skill,LangChain 官方 Deep Agent Skill 模式)
开发语言·python·langchain·numpy