返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#实现多线程编程的简单案例
  • 620
分享到

C#实现多线程编程的简单案例

2024-04-02 19:04:59 620人浏览 薄情痞子
摘要

目录一、使用线程的理由二、基本知识三、线程的使用四、线程池五、Task类六、委托异步执行一、使用线程的理由 1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。2、可以使用线

一、使用线程的理由

1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。
2、可以使用线程来简化编码。
3、可以使用线程来实现并发执行。

二、基本知识

1、进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。
2、前台线程和后台线程:通过Thread类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。
3、挂起(Suspend)和唤醒(Resume):由于线程的执行顺序和程序的执行情况不可预知,所以使用挂起和唤醒容易发生死的情况,在实际应用中应该尽量少用。
4、阻塞线程:Join,阻塞调用线程,直到该线程终止。
5、终止线程:Abort:抛出 ThreadAbortException 异常让线程终止,终止后的线程不可唤醒。Interrupt:抛出 ThreadInterruptException 异常让线程终止,通过捕获异常可以继续执行。
6、线程优先级:Highest AboveNORMal Normal BelowNormal Lowest ,默认为Normal。

三、线程的使用

线程函数通过委托传递,可以不带参数,也可以带参数(只能有一个参数),可以用一个类或结构体封装参数。

案例:

class Program
    {
        static void Main(string[] args)
        {
            Thread t1 = new Thread(new ThreadStart(TestMethod));//创建无参数数线程
            Thread t2 = new Thread(new ParameterizedThreadStart(TestMethod));//创建带参数的线程

            //设置为后台进程
            t1.IsBackground = true;
            t2.IsBackground = true;
            t1.Start();
            t2.Start("hello");
            Console.ReadKey();
        }

        public static void TestMethod()
        {
            Console.WriteLine("不带参数的线程函数");
        }

        //参数要定义为object 类型
        public static void TestMethod(object data)
        {
            string datastr = data as string;
            Console.WriteLine("带参数的线程函数,参数为:{0}", datastr);
        }
    }

四、线程池

由于线程的创建和销毁需要耗费一定的开销,过多的使用线程会造成内存资源的浪费,出于对性能的考虑,于是引入了线程池的概念。线程池维护一个请求队列,线程池的代码从队列提取任务,然后委派给线程池的一个线程执行,线程执行完不会被立即销毁,这样既可以在后台执行任务,又可以减少线程创建和销毁所带来的开销。
线程池线程默认为后台线程(IsBackground)。

class Program
    {
        static void Main(string[] args)
        {
            //将工作项加入到线程池队列中,这里可以传递一个线程参数
            ThreadPool.QueueUserWorkItem(TestMethod, "Hello");
            Console.ReadKey();
        }

        //线程函数
        public static void TestMethod(object data)
        {
            string datastr = data as string;
            Console.WriteLine(datastr);
        }
    }

五、Task类

使用ThreadPool的QueueUserWorkItem()方法发起一次异步的线程执行很简单,但是该方法最大的问题是没有一个内建的机制让你知道操作什么时候完成,有没有一个内建的机制在操作完成后获得一个返回值。为此,可以使用System.Threading.Tasks中的Task类。
构造一个Task<TResult>对象,并为泛型TResult参数传递一个操作的返回类型。

class Program
    {
        static void Main(string[] args)
        {
            Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000);
            t.Start();
            t.Wait();
            Console.WriteLine(t.Result);
            Console.ReadKey();
        }

        private static Int32 Sum(Int32 n)
        {
            Int32 sum = 0;
            for (; n > 0; --n)
                checked{ sum += n;} //结果太大,抛出异常
            return sum;
        }
    }

一个任务完成时,自动启动一个新任务。
一个任务完成后,它可以启动另一个任务,下面重写了前面的代码,不阻塞任何线程。

class Program
    {
        static void Main(string[] args)
        {
            Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000);
            t.Start();
            //t.Wait();
            Task cwt = t.ContinueWith(task => Console.WriteLine("The result is {0}", t.Result));
            Console.ReadKey();
        }

        private static Int32 Sum(Int32 n)
        {
            Int32 sum = 0;
            for (; n > 0; --n)
                checked { sum += n; } //结果溢出,抛出异常
            return sum;
        }
    }

六、委托异步执行

委托的异步调用:BeginInvoke() 和 EndInvoke()

namespace Test
{
    public delegate string MyDelegate(object data);
    class Program
    {
        static void Main(string[] args)
        {
            MyDelegate mydelegate = new MyDelegate(TestMethod);
            IAsyncResult result = mydelegate.BeginInvoke("Thread Param", TestCallback, "Callback Param");

            //异步执行完成
            string resultstr = mydelegate.EndInvoke(result);
        }

        //线程函数
        public static string TestMethod(object data)
        {
            string datastr = data as string;
            Console.WriteLine(datastr);
            return datastr;
        }

        //异步回调函数
        public static void TestCallback(IAsyncResult data)
        {
            Console.WriteLine(data.AsyncState);
        }
    }
}

异步回调函数在上面线程函数执行结束后,将要退出时执行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#实现多线程编程的简单案例

本文链接: https://lsjlt.com/news/146412.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#实现多线程编程的简单案例
    目录一、使用线程的理由二、基本知识三、线程的使用四、线程池五、Task类六、委托异步执行一、使用线程的理由 1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。2、可以使用线...
    99+
    2024-04-02
  • Linux C线程池简单实现实例
    Linux C线程池 三个文件 1 tpool.h typedef struct tpool_work { void (*routine)(void *); void ...
    99+
    2022-06-04
    线程 实例 简单
  • Qt5.9实现简单的多线程实例(类QThread)
    Qt开启多线程,主要用到类QThread。有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run()。当要开启新线程时,只需要实例该类,然后调用函数start(),就...
    99+
    2024-04-02
  • python 多线程简单实现
    1. 线程是什么?线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。2 为什么要用线程?a 单个线程可以在进程中独立运行c 并行操作,适用于C/S架构3 python怎么生成线程(将函数生...
    99+
    2023-01-31
    多线程 简单 python
  • C++Thread实现简单的socket多线程通信
    目录起因服务端ROS客户端普通客户端运行效果不足起因 为什么要用C++的Thread,很简单,因为我菜 一打五用pthread实现了socket多线程通信,我之前学并发的时候没看pt...
    99+
    2024-04-02
  • Python中的多线程实例(简单易懂)
    目录1.python中显示当前线程信息的属性和方法2.添加一个线程3.线程中的join函数4.使用Queue存储线程的结果5.线程锁lock前言: 多线程简单理解就是:一个CPU,也...
    99+
    2024-04-02
  • C#怎么实现多线程编程
    本文小编为大家详细介绍“C#怎么实现多线程编程”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现多线程编程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、使用线程的理由可以使用线程将代码同其他代码隔离...
    99+
    2023-06-30
  • Java编程之多线程死锁与线程间通信简单实现代码
    死锁定义 死锁是指两个或者多个线程被永久阻塞的一种局面,产生的前提是要有两个或两个以上的线程,并且来操作两个或者多个以上的共同资源;我的理解是用两个线程来举例,现有线程A和B同时操作两个共同资源a和b,A操作a的时候上锁LockA,继续执行...
    99+
    2023-05-30
    java 多线程 ava
  • C++实现一个简单的线程池的示例代码
    目录一、设计二、参数选择三、类设计一、设计 线程池应该包括 保存线程的容器,保存任务的容器。为了能保证避免线程对任务的竞态获取,需要对任务队列进行加锁。为了使得工作线程感知任务的到来...
    99+
    2024-04-02
  • Python多线程编程实例
    Python多线程编程 发布者:lanyulei,转载请注明出处:http://www.fdevops.com/p=517 下面多线程模块threading的方法注释,均来自于百度贴吧"学点编程吧"。 Thread: 表示一个线程的执行对象...
    99+
    2023-01-31
    多线程 实例 Python
  • java多线程编程实例
    以下是一个简单的Java多线程编程实例:```javapublic class MultiThreadExample impleme...
    99+
    2023-08-16
    Java
  • Linux中多线程详解及简单实例
    Linux中多线程详解及简单实例 1.概念 进程:运行中的程序。 线程:一个程序中的多个执行路径。更准确的定义是:线程是一个进程内部的一个控制序列。 2.为什么要有线程? 用fork调用进程...
    99+
    2022-06-04
    多线程 详解 实例
  • Android编程实现简单的UDP Client实例
    本文实例讲述了Android编程实现简单的UDP Client。分享给大家供大家参考,具体如下: 该代码在4.2.2内调试通过 1.记得加权限 <uses-permis...
    99+
    2022-06-06
    udp Android
  • python 简单搭建阻塞式单进程,多进程,多线程服务的实例
    我们可以通过这样子的方式去理解apache的工作原理 1 单进程TCP服务(堵塞式) 这是最原始的服务,也就是说只能处理个客户端的连接,等当前客户端关闭后,才能处理下个客户端,是属于阻塞式等待 fro...
    99+
    2022-06-04
    进程 多线程 实例
  • Python多线程爬虫简单示例
    python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用。 虽然...
    99+
    2022-06-04
    爬虫 示例 多线程
  • 怎么使用C++ Thread实现简单的socket多线程通信
    本篇内容介绍了“怎么使用C++ Thread实现简单的socket多线程通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务端多...
    99+
    2023-07-02
  • js多线程解决方案WebWorkers简单说明与实例演示
    一、什么是Web Worker JavaScript 语言是采用单线程模型,也就是任务只能在一个线程上完成,一次只能做一件事,前面任务没执行完,后面的任务只能排队等待,由...
    99+
    2023-02-18
    js多线程解决方案 Web Workers简单说明 Web Workers实例演示
  • python 简单的多线程链接实现代码
    服务端: #!/usr/bin/env import SocketServer class myMonitorHandler(SocketServer.BaseRequestHandler): def...
    99+
    2022-06-04
    多线程 代码 简单
  • Qt5多线程编程的实现
    目录一、线程基础1、GUI线程与工作线程2、数据的同步访问二、QT多线程简介三、QThread线程四、简单实例一、线程基础 1、GUI线程与工作线程 每个程序启动后拥有的第一个线程称...
    99+
    2024-04-02
  • C++怎么实现一个简单的线程池
    本文小编为大家详细介绍“C++怎么实现一个简单的线程池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现一个简单的线程池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、设计线程池应该包括保存线程的容...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作