`
king_tt
  • 浏览: 2267176 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C#基础:使用Thread创建线程

 
阅读更多

Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。下面我们用一个例子来解释怎样用Thread类来创建一个简单的线程

复制代码
       static void Main(string[] args)
        {
            #region Thread无参数举例
            Thread th = new Thread(ThreadChild);
            th.Start();
            Console.WriteLine("Main Thread Start!");
            #endregion
        }
        static void ThreadChild()
        {
            Console.WriteLine("Child Thread Start!");
        }
复制代码

输出结果

  程序运行的结果不能保证哪个先输出,因为线程是由操作系统调度,每次哪个线程在前面可以不同

给线程传递数据

  

  上面的例子演示了怎样用Thread类来创建一个不带传参的线程,下面我门来创建一个带传入参数的线程。给线程传递参数,有两种方式,一种是使用带ParameterizedThreadStart委托参数的Thread的构造函数,另外一种是定义一个自定义类。首先我们使用ParameterizedThreadStart委托来创建有传入参数的类。使用ParameterizedThreadStart,线程的入口(线程调用的方法)必须有一个Object类型的参数,使用Object我们首先想到的就是类型不安全。而且在执行线程的时候多半有装箱拆箱操作。管它的,我们先用这种方式来创建一个带传入参数的线程!!

  废话再多,还是没有直接上代码来得实在,看代码!!

复制代码
        static void Main(string[] args)
        {     
            #region 使用parameterizedThreadStart委托执行带参数的委托
            Thread th2 = new Thread(Thread_param);
            th2.Start(20);
            #endregion         
        }
        static void Thread_param(object msg)
        {
            int message = (int)msg;
            Console.WriteLine("Result:{0}",message);
        }
复制代码

运行结果

  

上面创建的线程是类型不安全的,那用什么样的方式执行带传入参数的线程的方法是类型安全的呢,答案就是创建一个自定义类,在类中定义一个作为传入参数的字段,将线程的主方法定义为一个类的实例方法。然而使用这种方法就可以使用泛型来解决使用ParameterizedThreadStart的类型不安全

看招!!!!

复制代码
class Program
    {
        static void Main(string[] args)
        {
            #region 使用自定义类实现带参数的线程
            MyThread<string> mythread = new MyThread<string>("Thread_child");
            Thread th3 = new Thread(mythread.ThreadChild);
            th3.Start();
            #endregion
        }
    }
    class MyThread<T>
    {
        private T data;
        public MyThread(T data)
        {
            this.data = data;
        }
        public void ThreadChild()
        {
            Console.WriteLine("Child Thread Start! Result:{0}",data);
        }
}
复制代码

运行结果:

后台线程  

  Thread类默认创建的是前台线程,所以我们前面创建的线程全部都是前台线程。只要有一个前台线程在运行,应用程序的进程就在运行。如果有多个前台线程在运行,而Main()方法(主线程)结束了,应用程序的进程就仍然是激活的,直到所有前台线程完成其任务为止。

  那后台线程呢?显然和前台线程相反。当主线程结束后,应用程序的进程就终止了,在所有前台线程结束后,后台线程就会被终止。

  在编码的时候我们可以设置Thread类的IsBackground的属性来确定该线程是前台线程还是后台线程。当IsBackground设置为False的时候,为前台线程,设置为Ture的时候为后台线程,下面我们举例来说明前台线程和后台线程的区别。首先我们创建一个前台线程。

复制代码
        static void Main(string[] args)
        {
            Thread th_pre = new Thread(Thread_pre)
            {Name="Thread_pre",IsBackground=flase};;
            th_pre.Start();
            Console.WriteLine("主线程执行完成!");
        }
        static void Thread_pre()
        {
            Console.WriteLine("子线程开始执行!");
            Thread.Sleep(3000);
            Console.WriteLine("子线程执行完成!");
        }
复制代码

运行结果

  从上面的运行结果可以看到,当主线程执行完成后,应用程序终止前就会子线程执行完成。

  下面我们来看看后台线程,看代码!!

复制代码
     static void Main(string[] args)
        {
       Thread th_back = new Thread(Thread_back)
       { Name="Thread_back",IsBackground=true };
            th_back.Start();
            Console.WriteLine("主线程执行完成!");
        }
        static void Thread_back()
        {
            Console.WriteLine("子线程开始执行!");
            Thread.Sleep(3000);
            Console.WriteLine("子线程执行完成!");
        }
复制代码

运行结果

  从运行结果可以看出,当主线程结束后,进程就终止了,后台线程也被终止,所以没有后台线程结束的输出信息。

控制线程

  我们使用Thread创建线程后,我们需要对线程进行控制。

  1、 使用Start()方法使线程处于Running状态,线程开始执行。

  2、 使用Join()方法使线程处于WaitSleepJoin状态,在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时 间为止。

  3、 使用Sleep()方法,也会使线程处于WaitSleepJoin状态,在经历Sleep()方法定义的时间段后,线程就会被再次唤醒。、

  4、 使用Abort()方法,会使线程处于ResetAbort()状态,线程在接到这个命令的时候,会抛出一个ThradAbordException类型的异常。

各位看官,看代码

复制代码
using System;
using System.Text;
using System.Threading;
namespace ConsoleThreadContral
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("mainThread Start!");
            Thread th = new Thread(newThread);
            th.Start();//将当前实例的状态更改为 ThreadState.Running。
            Console.WriteLine("newThread State:{0}",th.ThreadState);
            th.Join(100);//在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止或经过了指定时间为止。
            Console.WriteLine("newThread State:{0}", th.ThreadState);
            th.Abort();//在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。 调用此方法通常会终止线程。
            Console.WriteLine("newThread State:{0}", th.ThreadState);
        }
        static void newThread()
        {
            Console.WriteLine("newThread Start!");
            Thread.Sleep(10000);
            Console.WriteLine("newThread Complete!");
        }
    }
}
复制代码

运行结果

分享到:
评论

相关推荐

    C# winform动态创建和关闭多线程源码 可运行

    在C#中,可以使用以下方法关闭线程: 1. 设置Thread的IsBackground属性为true,这样当主线程结束时,后台线程也会自动停止。 2. 调用Thread的Abort方法强制终止线程。但这种方法可能会引发ThreadAbortException,且...

    C#多线程学习 Thread类使用 线程等编程方法

    System.Threading命名空间中的Thread类是实现多线程的基础,提供了创建、控制和管理线程的方法。本文将深入探讨C#多线程编程,包括Thread类的使用以及线程同步的相关知识。 ### 1. Thread类介绍 Thread类是C#中处理...

    C# Winform线程创建子窗体

    在C# Winform开发中,多线程技术是不可或缺的一部分,尤其当涉及到用户界面(UI)的异步操作时。线程允许程序同时执行多个任务,提高应用的响应性和效率。本话题将深入探讨如何利用线程来延迟创建子窗体,并且如何安全...

    C#多线程之Thread中Thread.IsAlive属性用法分析

    在下面的示例代码中,我们创建了一个新的线程`oThread`,并使用`ThreadStart`委托传递一个方法`Back.Start`作为线程的入口点。接着,通过调用`oThread.Start()`启动线程。然而,需要注意的是,`Start()`方法的调用...

    c#Thread后台线程使用

    C#Thread后台线程使用

    C#创建线程

    1. **System.Threading.Thread** 类:这是最基础的创建线程的方法。你可以创建一个Thread对象,并传入一个委托(方法)作为线程的入口点。例如: ```csharp Thread thread = new Thread(new ThreadStart...

    VS2008 C# 创建线程,根据按钮可以控制线程的运行情况。

    在Visual Studio 2008 (VS2008)中,开发人员可以使用C#语言来创建和管理线程,以实现多任务并行处理。本教程将详细介绍如何在VS2008中创建线程,并通过按钮来控制线程的运行状态。 首先,我们需要了解C#中的线程类`...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    1. **线程创建**:C#中创建线程主要有两种方式,一是通过`System.Threading.Thread`类,创建`Thread`对象并调用`Start`方法启动;二是通过实现`System.Threading.ThreadStart`或`System.Action`委托,利用`new ...

    C# 如何挂起线程、休眠线程和终止线程(源码例)

    C#中,我们可以使用System.Threading命名空间提供的Thread类来创建和管理线程。 1. **挂起线程**: 挂起线程意味着暂停该线程的执行,但保留其状态,以便稍后恢复。在C#中,我们可以通过调用Thread类的`Suspend()`...

    C#内存释放-线程控制-线程启动-线程暂停

    在C#中,我们通常使用`System.Threading`命名空间中的类来创建和管理线程。`Thread`类是最基本的线程对象,用于创建和执行新的线程。线程启动通常是通过`Thread.Start()`方法完成的,这使得新线程开始执行其`Thread...

    c# 多线程 上位机

    1.2 创建线程:在C#中,可以通过继承`System.Threading.Thread`类或实现`System.Threading.IAsyncStateMachine`接口来创建线程。更常用的是使用`Task`类,它提供了更简洁的异步编程模型。 1.3 线程同步与互斥:为了...

    C#创建多线程应用程序

    可以通过两种方式创建线程: - 使用Thread类的构造函数,传入一个委托(代表线程要执行的方法)。 ```csharp Thread thread = new Thread(new ThreadStart(MyMethod)); ``` - 使用Lambda表达式简化代码。 ```...

    C#线程间操作无效Study

    然而,线程间操作(Thread Interoperability)如果没有正确处理,可能会引发“线程间操作无效”(Invalid Cross-thread Access)异常。这个异常通常发生在UI线程与非UI线程尝试交互时,尤其是当非UI线程试图修改UI...

    C# Timer的多线程使用方法

    - **创建与使用**:使用`new Timer(TimerCallback, Object, DueTime, Interval)`构造函数,其中TimerCallback是触发时调用的方法,Object是传递给回调的用户状态,DueTime是首次触发的时间,Interval是后续触发的...

    【C#多线程】 动态创建多个线程后 需要关闭其中某个线程的解决实例。

    例如: for (int i = 0; i ; i++) { ...如何关闭其中的一个线程呢? 请下载解决方案。 呵呵,这个实例10分值的买, 觉得好的话就评个分吧,评分后会返回你11分 (一定要评分,光评论是不返分的)

    C#多线程基础知识资料合辑(基础部分)

    1. **线程的创建**:在C#中,可以使用`System.Threading.Thread`类来创建新的线程。通过实例化`Thread`类并提供一个代表新线程执行的委托,即可启动新线程。例如,`new Thread(new ThreadStart(MyThreadMethod))`,...

    c# 多线程任务中结束全部线程

    总结来说,C#中的多线程编程涉及到线程的创建、委托的使用以及线程间的通信和同步。通过合理地利用这些特性,开发人员可以构建出既高效又稳定的多线程应用程序。在处理多线程任务时,特别需要注意的是线程安全性和...

    C# 多线程实例多线程实例多线程实例

    1. 创建线程: - 使用`Thread`类:通过创建`Thread`对象并传递一个委托(方法)作为参数,可以启动新线程。例如: ```csharp Thread thread = new Thread(new ThreadStart(MyMethod)); thread.Start(); ``` - ...

    c#线程使用大炮打飞机

    在C#编程中,线程是并发执行任务的基础单元,"C#线程使用大炮打飞机"这个项目,很可能是为了教学目的设计的一个小游戏,旨在帮助初学者理解线程的概念和用法。在这个场景中,“大炮打飞机”游戏可能会有两个主要线程...

    C# MVC 线程和并发

    * 使用Thread类来创建多个线程 * 使用lock语句来保护共享资源 七、结语 * 本文讲解了线程和并发的基本概念和使用方式 * 在Web开发中,线程和并发是非常重要的知识点 * 本文的知识点应该足够,但如果后面有遇到本文...

Global site tag (gtag.js) - Google Analytics