01-多线程及异步委托

一、多线程:

1、概念:

线程:是Windows任务调度的最小单位。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 
 
2、为什么要用多线程:
①让计算机"同时"做多件事情,节约时间。
②多线程可以让一个程序“同时”处理多个事情。
③后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况。
 
3、产生一个线程的4步骤:
编写产生线程所要执行的方法
引用System.Threading命名空间
实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)
调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。
 
4、.net中如何实现多线程:
线程肯定也是要执行一段代码的。所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。(找个人来做一件事情)
线程启动时,通过委托调用该方法。(委托的好处)

(线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)

案例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace _07多线程
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程 {0} 正在执行中...", Thread.CurrentThread.ManagedThreadId);

            #region 线程
            //ThreadStart 无参无返回值的委托
            Thread thread = new Thread(ShowMsg);//新开启一个线程执行一个方法
            //建议操作系统把当前线程搞成高级别
            thread.Priority = ThreadPriority.Highest;
            //给开发人员用,来识别不同的线程
            thread.Name = "zy";
            //后台线程: 如果所有的前台线程都退出了,那么后台线程自动被关闭
            thread.IsBackground = true;
            thread.Start();//并没有执行,告诉操作系统准备就绪
            //thread.Abort();//关闭线程
            Console.ReadKey();       
            #endregion

        }

        static void ShowMsg()
        {
            Console.WriteLine("工作线程 {0} 执行中...",Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
        }
    }
}
View Code

运行截图:

5、Thread类的一些重要成员:

Start()启动线程
Abort()终止线程
Thread.Sleep(1) 静态方法,可以使当前线程停止一段时间运行
Name线程名
Thread.CurrentThread获得当前的线程引用
 
-----------------------------------------------------------------------------------
二、委托的异步调用:
1、了解一下几点:
BeginInvoke  异步调用
EndInvoke     获取异步调用的(方法)返回值
IAsyncResult  异步操作的状态
AsyncResult   异步操作的结果(可以获取当前执行的委托对象)
using System.Runtime.Remoting.Messaging;
注意:委托的异步调用只对单播委托
 
案例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace _07多线程
{
    public delegate int AddDel(int a,int b);//声明一个有参数有返回值的委托
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("主线程 {0} 正在执行中...", Thread.CurrentThread.ManagedThreadId);

            AddDel addDel = new AddDel(AddFunc);

            //1.同步调用
            //int c = addDel(1, 2);

            //2.无回调函数的异步调用
            //启动委托指向的方法来执行,具体由线程池提供一个线程来执行当前的委托指向的方法
            //IAsyncResult ascResult = addDel.BeginInvoke(1, 2, null, null);
            //while (!ascResult.IsCompleted)
            //{ 
            //    //主线程执行的其他操作
            //}
            ////此EndInvoke方法会阻塞当前线程。直到委托方法执行完毕后,
            ////并将返回值交给result后,继续执行后面的代码
            //int result = addDel.EndInvoke(ascResult);
            //Console.WriteLine(result);//3
            //Console.ReadKey();

            //3.有回调函数的异步调用
            IAsyncResult ascResult = addDel.BeginInvoke(1, 2, MyDelCallBack, 3);

            //主线程可继续执行其他操作
            Console.WriteLine("===========");
            Console.ReadKey();
        }

        static int AddFunc(int a, int b)
        {
            Console.WriteLine("AddFunc工作线程运行中...{0}", Thread.CurrentThread.ManagedThreadId);
            //Thread.Sleep(1000);
            return a + b;
        }

        //异步委托执行完成了的回调函数
        public static void MyDelCallBack(IAsyncResult result)
        {
            //把接口类型转换成实例类型
            AsyncResult aResult = (AsyncResult)result;

            //转换成我们自己的委托类型
            AddDel del = (AddDel)aResult.AsyncDelegate;

            //执行完成获取执行的结果
            int addResult = del.EndInvoke(result);
            int state = (int)aResult.AsyncState;//3

            Console.WriteLine("异步完成的回调方法执行的结果是:{0} @{1}", addResult, Thread.CurrentThread.ManagedThreadId);
        }
    }   
}
View Code

运行截图:

执行步骤:

①从线程池里获取一个线程。

②执行委托指向的方法(在工作线程里面执行)

③调用回调函数(如果是null不执行)。

 
原文地址:https://www.cnblogs.com/zy-style/p/4335486.html