.Net 多线程编程由浅入深知识梳理

1.Using System.Threading;
     多线程就是一个包工头,让手底下的十个工人去搬砖头的事儿。
    
------------不带任何传入参数的Thread
2.ThreadStart ts = new ThreadStart(某线程A的Func);
   Thread th = new Thread(ts);
   th.Start();
   
   public void 某线程A的Func()
   {
        Console.WriteLine("线程A把事情做好了!");
        Console.ReadKey();
   }
   
   原理解析
   2.1 ThreadStart原型为一个委托类型:
         public delegate void ThreadStart();
   2.2 ThreadStart这个委托类型是没有任何传入参数的
   
   如下可以让ThreadStart能够接收参数
    public class MyThread
    {
        private double _width = 10.0;
        private double _height = 9.0;
        private double result = 0.0;
        public MyThread(double width,double height)
        {
            this._width = width;
            this._height = height;
        }

public void MyThreadExc()
        {
            Console.WriteLine("MyThread Execute Start ...");
            Thread.Sleep(2000);
            result = _width * _height;
            Console.WriteLine("MyThread Execute Done:The Result is {0}", result);
        }
    }
    
    static void Main(string[] args)
    {
        MyThread th = new MyThread(5.0,3.0);
        Thread t = new Thread(new ThreadStart(th.MyThreadExc));
        t.Start();
        Console.ReadKey();
    }
   
         
 ------------带有参数的Thread
 3.ParameterizedThreadStart pts = new  ParameterizedThreadStart(某线程B的Func);
    Thread th = new Thread(pts);
    th.Start();
    
    public void 某线程B的Func(object param)
    {
         Console.WriteLine("线程B接收了param并把事情做好了!");
    }
    
    原理解析
    3.1 ParameterizedThreadStart原型为一个委托类型:
         public delegate void ParameterizedThreadStart(object obj);
    3.2 ParameterizedThreadStart这个委托类型是接收Object传参的
    
------------带有传入参数并且有返回参数
 刚才说到主线程需要知道子线程什么时候执行完成,我们可以用Thread.ThreadState枚举来进行判断
 当线程的ThreadState==Thread.Stop时,此时就可以判断该Thread已经结束,这时它的结果就可以使用了,如果不是这个状态,就继续执行别的工作,或等待再次尝试。倘若需要有多个子
 线程返回,并且需要他们的返回内容再进行异步计算,这就叫做线程同步了,下面将介绍一种方法,能够自定义参数个数,并且返回数据,使用起来很方便
 使用委托的异步调用方法和回调
 1. 需要异步调用的Func定义为一个委托
 2. BeginInvoke来异步调用 -- 第一个参数是传参,第二个参数是当线程执行完毕之后调用的方法 (穿插复习Invoke 与 BeginInvoke的区别)
 
 delegate double MyJobDelegate(double d);

static  MyJobDelegate myJob;
 
 double jobResult=0.0;
 
 static void Main(string[] args)
 {
     myJob = new MyJobDelegate(Job1);
     myJob.BeginInvoke(5.09,new AsyncCallback(Job1Done),null)
 }
 
 static double Job1(double d)
 {
     return d*Math.PI;
 }
 
 static void Job1Done(IAsyncResult result)
 {
     Console.WriteLine(myJob.EndInvoke(result));
 }
 
 Asynchronous 异步
 Synchronous  同步
 [在C#中使用线程的方法很多,使用委托的BeginInvoke和EndInvoke方法就是其中之一。BeginInvoke方法可以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值
 (EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用。]
 
 -------------线程池
 线程虽然是个好东西,但是也是一个资源消耗大户,我们需要用多线程,但是又不希望线程过多,线程池的机制就应运而生啦,.Net为我们提供了一个现成的ThreadPool,他的使用如下:
 
 ///
 ///首先下面这是线程池线程所要执行的回调方法
 ///
using System;
using System.Runtime.InteropServices;

namespace System.Threading
{
    // 摘要:
    //     表示线程池线程要执行的回调方法。
    //
    // 参数:
    //   state:
    //     包含回调方法要使用的信息的对象。
    [ComVisible(true)]
    public delegate void WaitCallback(object state);
}

static WaitCallback wait;

static void Main(string[] args)
{
    wait = new WaitCallback(myJob);
    ThreadPool.QueueUserWorkItem(wait,1.0);
    ThreadPool.QueueUserWorkItem(wait,2.0);
    ThreadPool.QueueUserWorkItem(wait,3.0);
    ThreadPool.QueueUserWorkItem(wait,4.0);
    Console.ReadKey();
}

private static void myJob(object obj)
{
    double d= (double)obj;
    Console.WriteLine("Job Exec Result: {0}",d*Math.PI);
}

-------------控制权
场景:如果Winfrom程式主线程创建了一个控件TextBox1,随后某个子线程开始创建并且工作,产生一个返回值,如果此时将该返回值返回给TextBox1,程式就会报错:禁止跨线程访问控件;
那么此时我们就需要用到控件的一个方法:BeginInvoke或Invoke,这个方法可以把执行上下文切换回创建这个控件的线程:
delegate void ChangeTextBoxDelegate(string newtext);

private void Button1_Click(object sender,EventArgs e)
{
    ParameterizedThreadStart pts = new ParameterizedThreadStart(myJob);
    Thread th = new Thread(pts);
    th.Start(1.09);
}

----------------方案1---------------
private void myJob(object obj)
{
    this.BeginInvoke(new ChangeTextBoxDelegate(this.TextBox1.AppendText)),((double)obj * Math.PI).ToString());
}

或者 (推荐)
----------------方案2--------------
    private void SetTextBox1Text(string text)
    {
        if(TextBox1.InvokeRequired)
        {
            ChangeTextBoxDelegate ct = SetTextBox1Text;
            TextBox1.BeginInvoke(ct,text);
        }
        else
        {
            TextBox1.Text = text;
        }
    }
    
    private void myJob(object obj)
    {
            SetTextBox1Text((double)obj * Math.PI).ToString());
    }
    参考:http://www.cnblogs.com/yizhu2000/archive/2007/10/12/922637.html

时间: 2024-11-08 22:46:59

.Net 多线程编程由浅入深知识梳理的相关文章

iOS多线程编程的知识梳理

多线程编程也称之为并发编程,由于其作用大,有比较多的理论知识,因此在面试中也是受到面试官的青睐.在日常项目开发中,至少网络请求上是需要使用到多线程知识的,虽然使用第三方的框架比如AFNetworking进行网络请求比较简单,但是也是需要开发人员对多线程.block等知识有比较清晰的思路,才能在遇到问题的时候,能够有条理的找出问题并解决好. 本篇文章的定位是梳理下在iOS开发中多线程的知识,也算是一个提纲,一来可以在学习或者是回顾多线程知识时候有个导向,二来也可以作为自己对多线程知识的一个检测,看

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握

.Net多线程编程—预备知识

1 基本概念 共享内存的多核架构:一个单独的封装包内封装了多个互相连接的未处理器,且所有内核都可以访问主内存.共享内存的多核系统的一些微架构,例如内核暂停功能,超频. 内核暂停功能:当使用内核不多的时候,操作系统会使剩下的内核进入休眠状态,当需要使用这些内核时,操作系统会唤醒这些睡眠的内核. 超频:提升一个内核频率的过程.当内核工作繁重时,使内核以更高的频率工作. 分布式内存系统:由多个处理器(CPU)组成,每个处理器可以位于不同的计算机上,计算机之间可以有不同类型的通信信道,并且都有自己私有的

浅析C++多线程编程理论与实践

写这篇博客之前,由于对多线程也不是很了解,一直觉得多线程是个很神奇的东西,但项目中又需要用到,所以借此机会学习了一下,也算做个入门总结吧,写下来总是好的!言归正传,首先介绍几个多线程相关的基本概念: 并发.并行.同步.异步.多线程的区别 1.并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行.其中两种并发关系分别是同步和互斥. 2.并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特征:在多处理器系统中,进程

android: 多线程编程基础

9.1   服务是什么 服务(Service)是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那 些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使 当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行. 不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务 时所在的应用程序进程.当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停 止运行. 另外,也不要被服务的后台概念所迷惑,实际上服务并不会

C++多线程编程入门之经典实例

多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制,但Windows系统为我们提供了相关API,我们可以使用它们来进行多线程编程.本文就以实例的形式讲解多线程编程的知识. 创建线程的API函数 C++代码 HANDLE CreateThread( __in   SEC_ATTRS SecurityAttributes, __in   ULONG StackSize,  

你必须掌握的多线程编程

1.多线程编程必备知识 1.1 进程与线程的概念 当我们打开一个应用程序后,操作系统就会为该应用程序分配一个进程ID,例如打开QQ,你将在任务管理器的进程选项卡看到QQ.exe进程,如下图: 进程可以理解为一块包含了某些资源的内存区域,操作系统通过进程这一方式把它的工作划分为不同的单元.一个应用程序可以对应于多个进程. 线程是进程中的独立执行单元,对于操作系统而言,它通过调度线程来使应用程序工作,一个进程中至少包含一个线程,我们把该线程成为主线程.线程与进程之间的关系可以理解为:线程是进程的执行

.NET多线程编程

在.NET多线程编程这个系列我们讲一起来探讨多线程编程的各个方面.首先我将在本篇文章的开始向大家介绍多线程的有关概念以及多线程编程的基础知识;在接下来的文章中,我将逐一讲述.NET平台上多线程编程的知识,诸如System.Threading命名空间的重要类以及方法,并就一些例子程序来作说明. 引言 早期的计算硬件十分复杂,但是操作系统执行的功能确十分的简单.那个时候的操作系统在任一时间点只能执行一个任务,也就是同一时间只能执行一个程序.多个任务的执行必须得轮流执行,在系统里面进行排队等候.由于计

多线程的基础知识

多线程编程基础知识 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的.本实例针对多线程技术在应用中经常遇到的问题,如线程间的通信.同步等,分