首页 > 编程语言 >C#多线程

C#多线程

时间:2024-05-13 14:20:07浏览次数:29  
标签:Task Thread C# 应用程序 线程 new 多线程

目录

C#线程

概述

定义

线程(thread)是计算机科学中将进程划分为两个或多个线程(实例)或子进程,由单处理器(单线程)或多处理器(多线程)或多核处理系统并发执行的一种抽象概念。每个线程都是独立的执行单元,拥有自己的程序计数器、栈、本地存储区和线程标识符。线程可以并发执行多个任务,提高应用程序的性能和响应速度。

程序、进程、线程

1个程序至少有1个进程,1个进程至少有1个线程。进程间不可以共享数据,线程之间可以共享同一个进程的数据。
进程是资源分配的基本单元,线程是cup执行的基本单元。<br/ >
进程之间的通信需要通过进程间通信(IPC)机制进行,而线程之间的通信可以共享内存或使用同步机制进行。

基本语法

C#可以通过Thread、ThreadPool、Task(推荐)创建线程。

  private static void Method(object c)
  {
      MessageBox.Show($"{c.ToString()},当前线程ID:{Thread.CurrentThread.ManagedThreadId}");
  }

  /// <summary>
  /// 1.Thread类是C#中用于创建和管理线程的标准类。new Thread()创建,thread.Start()执行。
  /// </summary>
  public static void ThreadDemo() 
  {
      // Thread thread = new Thread(new ThreadStart(Method));//ThreadStart不能传递参数
      Thread thread = new Thread(new ParameterizedThreadStart(Method));//ParameterizedThreadStart 只能传递object参数
      thread.IsBackground = true;//是否后台线程。
      thread.Start("Thread方式创建线程");
  }


  // <summary>
  /// 2.ThreadPool 可以使用QueueUserWorkItem 创建并执行。
  /// </summary>
  private static void ThreadPoolDemo()
  {
      ThreadPool.QueueUserWorkItem(new WaitCallback(Method), "ThreadPool方式创建线程");
  }

  // <summary>
  /// 3.Task 可以使用Task.Run() 或 new TaskFactory().StartNew() 创建并执行线程
  /// </summary>
  private static void TaskDemo()
  {
     Task.Run(() => { Method("Task方式创建线程"); });
     new TaskFactory().StartNew(() => { Method("TaskFactory方式创建线程"); });
  }

前台线程和后台线程

  • 前台线程[界面相关]: 前台线程是用户界面线程。应用程序必须等到所有前台线程结束后才能退出。如果应用程序在任何前台线程仍在运行时退出,则会导致应用程序崩溃。
  • 后台线程[业务逻辑相关]: 应用程序可以不等待后台线程结束就退出。后台线程会在应用程序退出后自动终止。
  • ThreadPool、Task 创建执行线程时默认为后台线程。

共享数据保护机制

  • 可以使用 Semaphore或lock包裹共享变量, 调整为同步策略。
  • 如下代码如果不使用锁, 5个Task同时修改count变量,将得不到结果500。
int count = 0;
/// <summary>
/// 5个Task 处理同一个程序Method2, 最后得到累计数据500。
/// </summary>
private void ShareData()
{
    for (int i = 0; i < 5; i++)
    {
        Task.Run(() => { Method2(); });
    }

    Thread.Sleep(1000);
    MessageBox.Show(count.ToString());
}

 private static object o = new object();
 Semaphore semaphore = new Semaphore(1, int.MaxValue);

 public void Method2()
 {

     for (int i = 0; i < 100; i++)
     {
         //lock (o)
         //{

         semaphore.WaitOne();
         count++;
         semaphore.Release();
        // }
     }
 }

优缺点/应用场景

优缺点

  • 多个线程可以并发执行多个任务,提高应用程序的整体性能、并发能力、响应速度。但它也可能会使应用程序更复杂更难维护。
  • 在使用多线程时,必须注意线程同步,以避免数据损坏或其他问题。
  • 线程池可以提高应用程序的性能和效率,但它也可能会使应用程序更难调试。

常见的应用场景

  • 耗时IO或三方服务:文件下载、日志记录、消息订阅、邮件短信发送等。
  • Web服务器: Web 服务器通常使用多线程来处理多个客户端的请求。每个请求都由一个单独的线程处理,这样可以避免单个请求阻塞其他请求。
  • 媒体播放器: 媒体播放器通常使用多线程来解码音频和视频数据。解码是一项耗时的操作,如果使用单线程进行解码,则会阻塞播放。使用多线程可以将解码和播放分开进行,从而提高播放的流畅性。
  • 游戏: 游戏通常使用多线程来渲染图形、处理玩家输入和更新游戏状态。这些任务都需要大量的 CPU 时间,使用多线程可以充分利用多核 CPU 的优势,从而提高游戏的性能。
  • 科学计算: 科学计算通常需要处理大量的数据,可以使用多线程来将计算任务分解成多个子任务,同时执行。这可以显著提高计算效率。

总结

多个线程可以提高应用程序的整体性能、并发能力、响应速度。但它使程序更难维护和调试。使用时注意共享数据同时修改,数据不一致问题。

标签:Task,Thread,C#,应用程序,线程,new,多线程
From: https://www.cnblogs.com/chi8708/p/18189117

相关文章

  • 【Halcon】示例程序学习——append_channel / tile_channels
    Name:1、append_channel——将其他矩阵(通达)附加到图像2、tile_channels——多张图像平铺成一个大图像signature:1、append_channel(MultiChannelImage,Image:ImageExtended::)2、tile_channels(Image:TiledImage:NumColumns,TileOrder:)Description:1、运算符ap......
  • VMware Avi Load Balancer 30.2.1 发布 - 多云负载均衡平台
    VMwareAviLoadBalancer30.2.1发布-多云负载均衡平台应用交付:多云负载均衡、Web应用防火墙和容器Ingress服务请访问原文链接:VMwareAviLoadBalancer30.2.1-多云负载均衡平台,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org负载均衡平台VMwareAviLoa......
  • VMware NSX Advanced Load Balancer (NSX ALB) 30.2.1 - 多云负载均衡平台
    VMwareNSXAdvancedLoadBalancer(NSXALB)30.2.1-多云负载均衡平台应用交付:多云负载均衡、Web应用防火墙和容器Ingress服务请访问原文链接:VMwareNSXAdvancedLoadBalancer(NSXALB)30.2.1-多云负载均衡平台,查看最新版。原创作品,转载请保留出处。作者主页:sysin......
  • dbeaver连接mysql报错Public Key Retrieval is not allowed
    这个错误通常发生在尝试通过JDBC连接MySQL数据库时,并且是由于MySQL的配置不允许公钥检索导致的。从MySQL5.0开始,连接时默认需要使用密钥进行密码加密传输。如果JDBC驱动程序尝试通过不允许公钥检索的方式进行连接,就会抛出这个错误。解决方法:更新JDBC连接字符串,添加允许公钥检......
  • DQN玩cartpole游戏
    importgymimporttorchimporttorch.nnasnnimporttorch.optimasoptimimportrandomimportpygameimportsysfromcollectionsimportdeque#定义DQN模型classDQN(nn.Module):def__init__(self):super(DQN,self).__init__()self.netwo......
  • actor critic 玩carpole游戏
     importgymimporttorchimporttorch.nnasnnimporttorch.optimasoptimimportpygameimportsys#定义Actor网络classActor(nn.Module):def__init__(self):super(Actor,self).__init__()self.fc=nn.Sequential(nn.Linea......
  • docker 安装 mysql8
    1、拉镜像dockerpullmysql:8 2、创建数据目录mkdir-p/home/dockerdata/mysql/confmkdir-p/home/dockerdata/mysql/logsmkdir-p/home/dockerdata/mysql/mysql 3、创建配置文件cd/home/dockerdata/mysql/conf/vimy.cnf[client]default-character-set=......
  • GRPC - Deploying: Envoy proxy
    Installfunc-e: https://func-e.io/func-emakesrunningEnvoy®easyfunc-e(pronouncedfunky)allowsyoutoquicklyseeavailableversionsofEnvoyandtrythemout.Thismakesiteasytovalidateconfigurationyouwoulduseinproduction.Eachtimeyoue......
  • 【WCH蓝牙系列芯片】-基于CH582开发板—主机枚举从机所有服务和特征
    -------------------------------------------------------------------------------------------------------------------------------------在使用沁恒的CH582蓝牙芯片的过程中,有时需要主机去连接蓝牙从机进行通信,主机在使用过程中工作流程是: 1、 蓝牙初始化完成后,开始扫描......
  • 在M1芯片的Mac上构建多平台Docker镜像
    在M1芯片的Mac上构建多平台Docker镜像在这篇博客中,我们将讨论如何在M1芯片的Mac上构建多平台的Docker镜像。我们将使用Docker的buildx命令,这是一个实验性的功能,用于启用对多平台镜像的构建。以下是我们的构建脚本:#创建一个名为mybuilder的新构建器实例,并设置为当前使用的构建......