首页 > 其他分享 >.net 高并发(二,多线程)

.net 高并发(二,多线程)

时间:2024-01-26 11:00:34浏览次数:23  
标签:Task Thread DoWork System ThreadPool 并发 线程 net 多线程

一,

多线程可以通过System.Threading.Thread类来实现。下面是一个简单的示例,展示如何使用Thread类创建和管理多个线程:

  using System;
  using System.Threading;
   
  class Program
  {
  static void Main()
  {
  // 创建两个线程
  Thread thread1 = new Thread(DoWork);
  Thread thread2 = new Thread(DoWork);
   
  // 启动线程
  thread1.Start();
  thread2.Start();
   
  // 等待所有线程执行完毕
  thread1.Join();
  thread2.Join();
   
  Console.WriteLine("所有线程执行完毕。");
  }
   
  static void DoWork()
  {
  // 模拟线程执行的任务
  for (int i = 0; i < 5; i++)
  {
  Console.WriteLine("线程 {0} 正在执行,当前索引值 {1}", Thread.CurrentThread.Name, i);
  Thread.Sleep(1000); // 模拟耗时操作
  }
  }
  }

在上面的示例中,我们创建了两个线程thread1thread2,并使用Start()方法启动它们。每个线程都执行DoWork()方法,该方法模拟了线程要执行的任务。通过调用Join()方法,主线程会等待其他线程执行完毕后再继续执行。最后,程序输出“所有线程执行完毕”。

请注意,多线程编程需要特别小心,因为多个线程可能同时访问共享资源,导致数据竞争和不一致的问题。因此,需要使用适当的同步机制(如锁、互斥量、信号量等)来保护共享资源,并确保线程安全地访问它们。

 

二,

ThreadPool类提供了一种用于管理和调度线程池中线程的方法。使用线程池可以减少创建和销毁线程的开销,并提高应用程序的性能。

下面是一个使用ThreadPool的简单示例:

  using System;
  using System.Threading;
   
  class Program
  {
  static void Main()
  {
  // 提交任务到线程池
  ThreadPool.QueueUserWorkItem(DoWork);
   
  // 等待所有任务执行完毕
  ThreadPool.JoinAll();
   
  Console.WriteLine("所有任务执行完毕。");
  }
   
  static void DoWork(object state)
  {
  // 模拟线程执行的任务
  for (int i = 0; i < 5; i++)
  {
  Console.WriteLine("线程池中的线程正在执行,当前索引值 {0}", i);
  Thread.Sleep(1000); // 模拟耗时操作
  }
  }
  }

在上面的示例中,我们使用ThreadPool.QueueUserWorkItem()方法将一个委托(这里是DoWork方法)提交到线程池中。该方法会异步执行,不会阻塞主线程。然后,通过调用ThreadPool.JoinAll()方法等待所有任务执行完毕。

与直接创建Thread对象相比,使用ThreadPool可以更高效地管理线程,因为线程池会根据需要自动调整线程的数量,并在不再需要时释放线程。此外,通过使用ThreadPool可以减少应用程序启动时创建的线程数量,从而减少资源消耗。

 

三,

Task类是System.Threading.Tasks命名空间下的一个重要类,它代表一个异步操作。使用Task可以简化多线程编程,并提供更好的控制和灵活性。

下面是一个使用Task的简单示例:

  using System;
  using System.Threading.Tasks;
   
  class Program
  {
  static void Main()
  {
  // 创建并启动Task
  Task task1 = Task.Run(() => DoWork());
  task1.Wait(); // 等待Task完成
   
  Console.WriteLine("任务1执行完毕。");
  }
   
  static void DoWork()
  {
  // 模拟异步任务的操作
  for (int i = 0; i < 5; i++)
  {
  Console.WriteLine("Task正在执行,当前索引值 {0}", i);
  Task.Delay(1000).Wait(); // 模拟耗时操作
  }
  }
  }

在上面的示例中,我们使用Task.Run()方法创建一个新的Task实例,并传入一个委托(这里是DoWork方法)作为参数。通过调用task1.Wait()方法,主线程会等待task1执行完毕后再继续执行。在DoWork()方法中,我们模拟了异步任务的操作,并通过Task.Delay()方法来等待一段时间,模拟耗时操作。

使用Task比直接使用Thread更方便,因为Task提供了更好的异常处理、状态管理、任务间通信和任务依赖性等功能。此外,通过使用Task可以更容易地利用并行处理和异步编程的优势,提高应用程序的性能和响应能力。

标签:Task,Thread,DoWork,System,ThreadPool,并发,线程,net,多线程
From: https://www.cnblogs.com/cdzh/p/17988883

相关文章

  • .net 高并发(一,异步编程模型)
    在.NET中,异步编程模型(Async/Await)是一种处理高并发的好方法。它允许开发人员以非阻塞的方式编写异步代码,从而使应用程序能够同时处理多个请求或任务,从而提高并发性能。下面是使用Async/Await进行异步编程的一般步骤:定义一个返回Task或Task<TResult>的方法,并在方法签名中使用as......
  • github action 自动化部署asp.net core应用到服务器
    在自己的仓库里工作流编辑workflow贴上自己的工作流name:ASP.NETCoreDeploymenton:push:branches:-master#你可以根据需要更改分支名称(在向master分支推送的时候触发这个workflow)jobs:deploy:runs-on:ubuntu-latest#使用Ubuntu环......
  • java报错javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorEx
    解决办法:1、用浏览器登录该https网站,在浏览器地址栏里找到“证书信息”->“详细信息”->“复制到文件”->选择DER编码二进制X.509(.CER)(D)导出证书,如证书名为pro1.cer;2、在jdk的jre/bin包里执行keytool-import-aliaspro1-keystore/usr/java/jdk1.8.0/jre/lib/security/c......
  • 无涯教程-Rust - 并发(Concurrency)
    在并发编程中,程序的不同部分独立执行,另一方面,在并行编程中,程序的不同部分会同时执行。线程数我们可以使用线程同时运行代码,在当前的操作系统中,已执行程序的代码在一个进程中运行,并且操作系统一次管理多个进程,在您的程序中,您还可以具有可以同时运行的独立部分,运行这些独立部分的......
  • Python并发编程之锁
    锁【一】同步原语操作系统—同步原语-CSDN博客实现互斥锁的并发程序设计-皮特森算法【Peterson算法-维基百科】​ 同步原语是一组用于协调多个执行线程或进程之间操作顺序和共享资源访问的基本机制。这些机制的目的是确保多个执行单元能够按照某种协调方式执行,以避免并发......
  • .NET GC的SustainedLowLatency模式引发内存的问题
    最近遇到一个问题,应用的内存占用升上去后一直降不下来,打了dump文件后发现GC的Generation0上有很多空白区间没释放,按道理第0代堆是经常回收的,怎么会有那么多空白区间呢?查阅了相关文档后,发现这是由代码中的System.Runtime.GCSettings.LatencyMode=System.Runtime.GCLatencyMode......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--PDF预览器框选
    项目地址:Pdfium.Net:https://github.com/1000374/Pdfium.NetPdfiumViewer:https://github.com/1000374/PdfiumViewer框选PDF坐标及区域内文字:关键代码://选中区域的坐标转成相对于pdf的坐标varpoint1=this.PointToPdf(newPoint(_currRect.X,_currRect.Y));varpoint2=......
  • OpenMP学习 第十章 超越通用核心的多线程
    第十章超越通用核心的多线程基于通用核心的附加子句并行构造的附加子句:num_threads(integer-expression)用于设置线程总数.if(scalar-expression)用于为并行构造提供条件分支.copyin(list)proc_bind(master|close|spread)为了测试num_threads子句与if子句的用法,......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--打开大文件处理
    项目地址:Pdfium.Net:https://github.com/1000374/Pdfium.NetPdfiumViewer:https://github.com/1000374/PdfiumViewerPDFium支持打开文件支持传入文件流加载PDF到内存流(此种方式不占用文件):varstream=newMemoryStream(File.ReadAllBytes(fileName));vardoc=PdfDocumentGdi.......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--快速入门
    Pdfium.Net.Free支持.NETFramework4.0.NETFramework4.5.NETStandard2.0可以和PdfiumViewer.Free共同使用预览pdf,也可以直接引用Pdfium.Net.Free操作pdf,解决部分.NetCore调用的问题,Pdfium.Net.Free封装了现有Pdfium的函数,实现了部分操作pdf的功能,部分功能等待后......