zoukankan      html  css  js  c++  java
  • [非技术参考]C#基础:使用Thread创建线程(1)

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

    static void Main(string[] args)
    {
        //region只是用来包裹代码用的,实际没有什么用
        #region Thread无参数举例
        Thread th = new Thread(ThreadChild);
        th.Start();
        Console.WriteLine("Main Thread Start!");
        #endregion
     
        Console.ReadKey();
    }
    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
     
        Console.WriteLine("Main Thread");
        Console.ReadKey();
    }
     
    static void Thread_param(object msg)
    {
        int message = (int)msg;
        Console.WriteLine("Result:{0}", message);
    }

    运行结果:


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

    class Program
    {
        static void Main(string[] args)
        {
            #region 使用自定义类实现带参数的线程
            MyThead<string> myThread = new MyThead<string>("Child_Thread");
            Thread th3 = new Thread(myThread.ThreadChild);
            th3.Start();
            #endregion
     
            Console.WriteLine("Main Thread is going!");
            Console.ReadKey();
        }
     
    }//class 
     
    class MyThead<T>
    {
        private T data;
     
        public MyThead(T data)
        {
            this.data = data;
        }
     
        public void ThreadChild()
        {
            Console.WriteLine("Child Thread Started! 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=false};
        th_pre.Start();
        Console.WriteLine("主线程执行完成");
    }
     
    static void Thread_pre()
    {
        Console.WriteLine("子线程开始执行");
        Thread.Sleep(3000);
        Console.WriteLine("子线程完成执行");
    }

    执行结果:

    下面我们来看看后台线程:

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

    运行结果:

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


    提示:

    上面的代码部分有一个C#3.0的新特性,对象初始化设置。

    例如,有如下类:

    public class Document
    {
        public string Title { get; set; }
        public string Content { get; set; }
    }

    C# 2.0 为 Document 对象的属性赋值,可能通过如下的方式:

    Document doc = new Document();
    doc.Title = "标题";
    doc.Content = "内容";

    用了三行代码,能不能更简洁一点呢?可以用构造函数,这的确是个办法,但也不是特别好,因为不是每种情况下构造函数都会把所有的属性列出来。C# 3.0 的对象初始化设置提供了一种方案:

    Document doc = new Document { Title = "标题", Content = "内容" };
    • 去掉实例化时的小括号,如果需要构造函数初始化其他成员变量,这里要加上小括号;
    • 增加大括号;
    • 在大括号里为需要赋值的属性赋值。

    其实这段代码是这样工作的:

    • 首先,用没有参数的构造函数去实例化对象,如果要初始化其他的成员变量,就不会调用无参的构造函数;
    • 然后,根据大括号中的属性及属性值,为对象属性赋值。

    这一节很简单,就是了解一下线程的创建和给线程传递参数的方法,同时说了一个前台线程和后台线程,加入了一个C#3.0的新特性。其他的没有什么。

    原文转载地址:http://www.cnblogs.com/lvcy/archive/2012/06/16/2551539.html

  • 相关阅读:
    iframe嵌套网页
    text-shadow用法
    响应式布局
    JavaScript控制显示与隐藏
    JavaScript数据类型
    JavaScript基础
    自适应网页设计/响应式Web设计
    不是人家太装逼,而是我们太low
    HTML空格的特性
    如何在Crystal Report中加入Html Field, Rtf Field
  • 原文地址:https://www.cnblogs.com/stemon/p/4197314.html
Copyright © 2011-2022 走看看