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
}
相关推荐
yi碗汤园31 分钟前
【一文了解】C#的StringSplitOptions枚举
开发语言·前端·c#
无敌最俊朗@2 小时前
C++ 序列容器深度解析:vector、deque 与 list
开发语言·数据结构·数据库·c++·qt·list
Da Da 泓2 小时前
LinkedList模拟实现
java·开发语言·数据结构·学习·算法
Humbunklung3 小时前
VC++ 使用OpenSSL创建RSA密钥PEM文件
开发语言·c++·openssl
Humbunklung3 小时前
填坑:VC++ 采用OpenSSL 3.0接口方式生成RSA密钥
开发语言·c++·rsa·openssl 3.0
zl21878654484 小时前
Playwright同步、异步、并行、串行执行效率比较
开发语言·python·测试工具
Tony Bai4 小时前
【Go开发者的数据库设计之道】05 落地篇:Go 语言四种数据访问方案深度对比
开发语言·数据库·后端·golang
gopyer4 小时前
180课时吃透Go语言游戏后端开发3:Go语言中其他常用的数据类型
开发语言·游戏·golang·游戏后端开发
come112345 小时前
Go vs. PHP:核心优势劣势对比
开发语言·golang·php
eqwaak05 小时前
Flask实战指南:从基础到高阶的完整开发流程
开发语言·后端·python·学习·flask