当前位置: 代码网 > it编程>编程语言>C# > C#多线程

C#多线程

2024年05月16日 C# 我要评论
目录C#线程概述定义程序、进程、线程基本语法C#可以通过Thread、ThreadPool、Task(推荐)创建线程。前台线程和后台线程共享数据保护机制优缺点/应用场景优缺点常见的应用场景总结 C#线程 概述 定义 线程(thread)是计算机科学中将进程划分为两个或多个线程(实例)或子进程,由单处 ...

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 的优势,从而提高游戏的性能。
  • 科学计算: 科学计算通常需要处理大量的数据,可以使用多线程来将计算任务分解成多个子任务,同时执行。这可以显著提高计算效率。

总结

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

(0)

相关文章:

  • WPF实现html中的table控件的示例代码

    前言相信很多做wpf开发的小伙伴都遇到过表格类的需求,虽然现有的grid控件也能实现,但是使用起来的体验感并不好,比如要实现一个excel中的表格效果,估计你能想到的第一个方法就是…

    2024年05月15日 编程语言
  • C# wpf嵌入winform控件的示例详解

    前言wpf的强大界面能力,再加上winform的性能以及灵活性,那基本上什么界面都能够做的很好。比如视频渲染用winform,功能按键用wpf,就能达到性能和界面效果和完美结合。w…

    2024年05月15日 编程语言
  • 详解C# wpf如何嵌入hwnd窗口

    详解C# wpf如何嵌入hwnd窗口

    前言wpf是direct ui,窗口中只有一个hwnd句柄,大部分控件都是直接在上面绘制的。当我们需要使用不同的渲染方式进行绘制时,就会和控件绘制产生冲突。比如... [阅读全文]
  • C#实现实时监控文件夹变化

    C#实现实时监控文件夹变化

    在开发各种应用程序时,我们经常需要对文件系统中的文件或文件夹进行实时监测,以便在文件内容改变、文件被创建或删除时能够及时做出反应。在 c# 中,system.i... [阅读全文]
  • c# 执行动态编译的方法实例详解

    c# 执行动态编译的方法实例详解

    c# 执行动态编译的方法在c#中执行动态编译的一种方法是使用 csharpcodeprovider 类。这类可以用来编译和执行c#代码,下面是一个简单的例子:u... [阅读全文]
  • C#结合Minio实现文件上传存储与更新

    C#结合Minio实现文件上传存储与更新

    前言minio是一个开源的对象存储服务器,专门设计用于在大规模数据存储环境中运行。它兼容amazon s3 api,因此可以作为一个替代方案用于存储和检索数据,... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com