事实上合情合理采用I/威尼斯人娱乐O线程在简报项目或文件下载时,新建线程

运作结果:

        delegate string MyDelegate(string name);

六、异步
SqlCommand

            Console.ReadKey();
        }

当要监视多个运转指标的时候,使用IAsyncResult.WaitHandle.WaitOne可就派不上用场了。
幸亏.NET为WaitHandle准备了此外多个静态方法:WaitAny(waitHandle[],
int)与WaitAll (waitHandle[] , int)。
内部WaitAll在等候全数waitHandle达成后再回去三个bool值。
而WaitAny是等待之中二个waitHandle完毕后就回来1个int,那么些int是象征已形成waitHandle在waitHandle[]中的数组索引。
上面就是采纳WaitAll的例子,运维结果与运用 IAsyncResult.IsCompleted
相同。

thread.Start(object);

   

        static void Main(string[] args)
        {
            MyDelegate delegate1 = new MyDelegate(METHOD);
            var methods=delegate1.GetType().GetMethods();
            if (methods != null)
                foreach (MethodInfo info in methods)
                    Console.WriteLine(info.Name);
            Console.ReadKey();
         }
     }

注意透过CLMurano线程池所确立的线程总是暗中同意为后台线程,优先级数为ThreadPriority.Normal。

        static string Hello(string name)
        {
            ThreadMessage(“Async Thread”);
            Thread.Sleep(2000);
            return “\nHello ” + name;
        }

   

 //打消终止,继续执行线程
Thread.ResetAbort();

威尼斯人娱乐 1

        static void Main(string[] args)
        {
            ThreadMessage(“Main Thread”);

威尼斯人娱乐 2

委托结果包涵首要方法

叁 、以ThreadStart方式达成十六线程

异步调用委托方法,BeginInvoke
方法除最终的五个参数外,别的参数都以与格局参数相呼应的。通过 BeginInvoke
方法将回来一个兑现了 System.IAsyncResult
接口的靶子,之后就能够利用EndInvoke(IAsyncResult )
方法就足以结束异步操作,获取委托的运维结果。

运营结果:

劳重力线程,直接运用方法,无再次来到值,需传递object对象,可不带参数暗中同意为null

1 public class Person
2 {
3 public string Name
4 {
5 get;
6 set;
7 }
8 public int Age
9 {
10 get;
11 set;
12 }
13 }
14
15 public class Message
16 {
17 public void ShowMessage(object person)
18 {
19 if (person != null)
20 {
21 Person _person = (Person)person;
22 string message = string.Format(“\n{0}’s age is {1}!\nAsync threadId
is:{2}”,
23 _person.Name,_person.Age,Thread.CurrentThread.ManagedThreadId);
24 Console.WriteLine(message);
25 }
26 for (int n = 0; n < 10; n++)
27 {
28 Thread.Sleep(300);
29 Console.WriteLine(“The number is:” + n.ToString());
30 }
31 }
32 }
33
34 class Program
35 {
36 static void Main(string[] args)
37 {
38 Console.WriteLine(“Main threadId
is:”+Thread.CurrentThread.ManagedThreadId);
39
40 Message message=new Message();
41 //绑定带参数的异步方法
42 Thread thread = new Thread(new
ParameterizedThreadStart(message.ShowMessage));
43 Person person = new Person();
44 person.Name = “Jack”;
45 person.Age = 21;
46 thread.Start(person); //运行异步线程
47
48 Console.WriteLine(“Do something ……….!”);
49 Console.WriteLine(“Main thread working is complete!”);
50
51 }
52 }

           while (!result.AsyncWaitHandle.WaitOne(200))
            {
                Console.WriteLine(“Main thead do work!”);
            }
            string data=myDelegate.EndInvoke(result);
            Console.WriteLine(data);
           
            Console.ReadKey();
        }

运行结果

A调用事件,完结播放作用

威尼斯人娱乐 3


行使CL本田UR-V线程池中的工小编线程,最灵敏最常用的法门就是选拔委托的异步方法,在此先不难介绍一下委托类。

透过线程池控制:

④ 、CL帕杰罗线程池的劳引力线程

public class MyDelegate:MulticastDelegate
    {
        public MyDelegate(object target, int methodPtr);
        //调用委托方法
        public virtual void Invoke();
        //异步委托
        public virtual IAsyncResult BeginInvoke(AsyncCallback
callback,object state);
        public virtual void EndInvoke(IAsyncResult result);
    }

威尼斯人娱乐 4

loginForm.ShowUpdate += new LoginForm.DisplayUpdate(loginincallback);

透过ThreadStart来创立一个新线程是最直白的方法,但诸如此类创设出来的线程相比难管理,假使成立过多的线程反而会让系统的性质下载。有见及此,.NET为线程管理尤其设置了2个CLLX570线程池,使用CLRAV4线程池系统能够更客观地保管线程的施用。全部请求的劳务都能运作于线程池中,当运营甘休时线程便会回归到线程池。通过安装,能控制线程池的最大线程数量,在伸手超出线程最大值时,线程池能依据操作的先行级别来执行,让有个别操作处于等候状态,待有线程回归时再实施操作。

        static void Main(string[] args)
        {
            ThreadMessage(“Main Thread”);
           
            //建立法委员会委员托
            MyDelegate myDelegate = new MyDelegate(Hello);
            //异步调用委托,获取总计结果
            IAsyncResult result=myDelegate.BeginInvoke(“Leslie”, null,
null);
            //在异步线程未成功前举行此外工作
            while (!result.IsCompleted)

3.6 终止线程

            Console.WriteLine(data+”\n”+message);
        }

   

class Program
    {
        public class Person
        {
            public string Name;
            public int Age;
        }

基础知识就为大家介绍到这边,上边将详细介绍四线程的支付。

        static void ThreadMessage(string data)
        {
            string message = string.Format(“{0}\n  ThreadId is:{1}”,
                   data, Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine(message);
        }
    }

3.2 使用ParameterizedThreadStart委托

            //获取委托对象,调用EndInvoke方法获得运维结果
            AsyncResult _result = (AsyncResult)result;
            MyDelegate myDelegate =
(MyDelegate)_result.AsyncDelegate;
            string data = myDelegate.EndInvoke(_result);
            //获取Person对象
            Person person = (Person)result.AsyncState;
            string message = person.Name + “‘s age is ” +
person.Age.ToString();

   

        static void Completed(IAsyncResult result)
        {
            ThreadMessage(“Async Completed”);

七 、并行编制程序与PLINQ

主线程等待异步线程运维停止后继续执行

在第三节曾经介绍过线程Thread有多个性格IsBackground,通过把此属性设置为true,就足以把线程设置为后台线程!那时应用程序域将在主线程实现时就被卸载,而不会等待异步线程的运转。

BeginInvoke,调用回调函数方法  ,代码实例:

CLLX570线程池分为工作者线程(workerThreads)与I/O线程
(completionPortThreads)
三种,工小编线程是生死攸关用作管理CLTiggo内部对象的运作,I/O(Input/Output)
线程顾名思义是用来与外表系统交流音信,IO线程的底细将在下一节详细表达。

thread.Start();

   

        static void ThreadMessage(string data)
        {
            string message = string.Format(“{0}\n  ThreadId is:{1}”,
                   data,Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine(message);
        }
    }

2.1.1 线程的标识符

BeginInvoke,不调用回调函数方法  ,代码实例:

   

新建线程 ,无重临值,带参数

眼下说过,一个行使程序域中或者包蕴多个上下文,而因此CurrentContext可以取得线程当前的上下文。

            {
                Thread.Sleep(200);      //虚拟操作
                Console.WriteLine(“Main thead do work!”);
            }

CurrentThread是最常用的叁个属性,它是用于获取当前运作的线程。

Thread thread = new Thread(new ParameterizedThreadStart(object));

2.3 线程的治本方式

事件注册委托,完成广播功能

   

            //建立法委员会委员托
            MyDelegate myDelegate = new MyDelegate(Hello);
           
            //建立Person对象
            Person person = new Person();
            person.Name = “Elva”;
            person.Age = 27;
           
            //异步调用委托,输入参数对象person, 获取计算结果
            myDelegate.BeginInvoke(“Leslie”, new
AsyncCallback(Completed), person);           
         
            //在起步异步线程后,主线程能够持续做事而不需求静观其变
            for (int n = 0; n < 6; n++)
                Console.WriteLine(”  Main thread do work!”);
            Console.WriteLine(“”);

1.2 多线程

class Program
    {
        delegate void MyDelegate();

4.4  委托类       

Thread thread = new Thread(new ThreadStart());

   

public interface IAsyncResult
{
    object AsyncState {get;}           
//获取用户定义的对象,它界定或带有关于异步操作的新闻。
    WailHandle AsyncWaitHandle {get;}   //获取用于等待异步操作完毕的
WaitHandle。
    bool CompletedSynchronously {get;} 
//获取异步操作是或不是同步实现的指令。
    bool IsCompleted {get;}            
//获取异步操作是还是不是已形成的指令。
}

3.3 前台线程与后台线程

            //此处可进入多个检查和测试对象
            WaitHandle[] waitHandleList = new WaitHandle[] {
result.AsyncWaitHandle,…….. };
            while (!WaitHandle.WaitAll(waitHandleList,200))
            {
                Console.WriteLine(“Main thead do work!”);
            }

   

        static string Hello(string name)
        {
            ThreadMessage(“Async Thread”);
            Thread.Sleep(2000);
            return “Hello ” + name;
        }

威尼斯人娱乐 5

简易线程序控制制情势:

四 、CL福睿斯线程池的劳动力线程

使用委托达成劳引力线程:

2.1.4 System.Threading.Thread的方法

        public delegate void DisplayUpdate(string message);
        //注明事件
        public event DisplayUpdate ShowUpdate;

经过ThreadPool.Get马克斯(out int workerThreads,out int
completionPortThreads )和 ThreadPool.Set马克斯( int workerThreads, int
completionPortThreads)七个方法能够分别读取和安装CL奇骏线程池安徽中华工程集团笔者线程与I/O线程的最大线程数。在Framework2.0中最大线程默许为25*CPU数,在Framewok3.0、4.0中最大线程数暗中同意为250*CPU数,在新近
I3,I5,I7 CPU出现后,线程池的最大值一般私下认可为一千、两千。
若想测试线程池中有稍许的线程正在投入使用,能够经过ThreadPool.GetAvailableThreads( out
int workerThreads,out int completionPortThreads ) 方法。

IAsyncResult BeginInvoke(string name,AsyncCallback callback,object
state)

威尼斯人娱乐 6

信托实例主要方法

属性名称

说明

CurrentContext

获取线程正在其中执行的当前上下文。

CurrentThread

获取当前正在运行的线程。

ExecutionContext

获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。

IsAlive

获取一个值,该值指示当前线程的执行状态。

IsBackground

获取或设置一个值,该值指示某个线程是否为后台线程。

IsThreadPoolThread

获取一个值,该值指示线程是否属于托管线程池。

ManagedThreadId

获取当前托管线程的唯一标识符。

Name

获取或设置线程的名称。

Priority

获取或设置一个值,该值指示线程的调度优先级。

ThreadState

获取一个值,该值包含当前线程的状态。

假定想为回调函数字传送送一些表面新闻,就能够运用BeginInvoke(AsyncCallback,object)的最后3个参数object,它同意外部向回调函数输入任何类型的参数。只要求在回调函数中选拔AsyncResult.AsyncState 就足以拿走object对象。

一 、线程的定义

新建线程,无重返值,不带参

回到目录


应用ThreadStart与ParameterizedThreadStart建立新线程非凡简单,但经过此办法创制的线程难于管理,若建立过多的线程反而会潜移默化系统的质量。
有见及此,.NET引入CLLX570线程池那几个概念。CLEnclave线程池并不会在CL哈弗开首化的时候即刻创建线程,而是在应用程序要创设线程来实施任务时,线程池才早先化二个线程。线程的伊始化与其余的线程一样。在成功职务之后,该线程不会自动销毁,而是以挂起的情形重临到线程池。直到应用程序再度向线程池发出请求时,线程池里挂起的线程就会再一次激活执行任务。那样既节省了创立线程所造成的性质损耗,也足以让多少个任务反复重用同一线程,从而在应用程序生存期内节约大批量开发。

class Program
    {
        delegate string MyDelegate(string name);

4.3 通过QueueUserWorkItem运转工小编线程

thread.join();

威尼斯人娱乐 7

缺点:不可带四个参数,不可重临值

1 class Program
2 {
3 delegate string MyDelegate(string name);
4
5 static void Main(string[] args)
6 {
7 ThreadMessage(“Main Thread”);
8
9 //建立法委员会委员托
10 MyDelegate myDelegate = new MyDelegate(Hello);
11 //异步调用委托,获取计算结果
12 myDelegate.BeginInvoke(“Leslie”, new AsyncCallback(Completed),
null);
13 //在起步异步线程后,主线程能够三番五次做事而不要求等待
14 for (int n = 0; n < 6; n++)
15 Console.WriteLine(” Main thread do work!”);
16 Console.WriteLine(“”);
17
18 Console.ReadKey();
19 }
20
21 static string Hello(string name)
22 {
23 ThreadMessage(“Async Thread”);
24 Thread.Sleep(2000); \\效仿异步操作
25 return “\nHello ” + name;
26 }
27
28 static void Completed(IAsyncResult result)
29 {
30 ThreadMessage(“Async Completed”);
31
32 //获取委托对象,调用EndInvoke方法取得运营结果
33 AsyncResult _result = (AsyncResult)result;
34 MyDelegate myDelegate = (MyDelegate)_result.AsyncDelegate;
35 string data = myDelegate.EndInvoke(_result);
36 Console.WriteLine(data);
37 }
38
39 static void ThreadMessage(string data)
40 {
41 string message = string.Format(“{0}\n ThreadId is:{1}”,
42 data, Thread.CurrentThread.ManagedThreadId);
43 Console.WriteLine(message);
44 }
45 }

 ThreadPool.QueueUserWorkItem(WaitCallback)
 ThreadPool.QueueUserWorkItem(WaitCallback,Object) 

留神上述多个例子都未曾行使Console.ReadKey(),但系统依然会等待异步线程达成后才会完毕。那是因为运用Thread.Start()运营的线程私下认可为前台线程,而系统必须等待全体前台线程运营结束后,应用程序域才会活动卸载。

                if (ShowUpdate != null) ShowUpdate(message);

在System.Threading命名空间内提供多个艺术来塑造八线程应用程序,在那之中ThreadPool与Thread是三十二线程开发中最常用到的,在.NET中特意设定了1个CL帕杰罗线程池专门用来管理线程的运行,那些CLEvoque线程池就是通过ThreadPool类来管理。而Thread是治本线程的最直白方式,下边几节将详细介绍有关内容。

当调用Invoke()方法时,对应此委托的具备办法都会被实施。而BeginInvoke与EndInvoke则支持委托方法的异步调用,由BeginInvoke运营的线程都属于CLSportage线程池中的工小编线程,在底下将详细表达。

成员名称

说明

Lowest

可以将 Thread 安排在具有任何其他优先级的线程之后。

BelowNormal

可以将 Thread 安排在具有 Normal 优先级的线程之后,在具有 Lowest 优先级的线程之前。

Normal

默认选择。可以将 Thread 安排在具有 AboveNormal 优先级的线程之后,在具有BelowNormal 优先级的线程之前。

AboveNormal

可以将 Thread 安排在具有 Highest 优先级的线程之后,在具有 Normal 优先级的线程之前。

Highest

可以将 Thread 安排在具有任何其他优先级的线程之前。

当要监视多少个运转指标的时候,使用IAsyncResult.WaitHandle.WaitOne可就派不上用场了。
幸亏.NET为WaitHandle准备了其它五个静态方法:WaitAny(waitHandle[],
int)与WaitAll (waitHandle[] , int)。
其间WaitAll在等候全部waitHandle完结后再再次来到2个bool值。
而WaitAny是等待之中2个waitHandle达成后就重临多少个int,那个int是意味已成功waitHandle在waitHandle[]中的数组索引。
上边就是使用WaitAll的例证,运维结果与应用 IAsyncResult.IsCompleted
相同。

1 class Program
2 {
3 delegate string MyDelegate(string name);
4
5 static void Main(string[] args)
6 {
7 ThreadMessage(“Main Thread”);
8
9 //建立法委员会委员托
10 MyDelegate myDelegate = new MyDelegate(Hello);
11 //异步调用委托,获取计算结果
12 IAsyncResult result=myDelegate.BeginInvoke(“Leslie”, null, null);
13 //完毕主线程其余工作
14 ………….
15 //等待异步方法成功,调用EndInvoke(IAsyncResult)获取运营结果
16 string data=myDelegate.EndInvoke(result);
17 Console.WriteLine(data);
18
19 Console.ReadKey();
20 }
21
22 static string Hello(string name)
23 {
24 ThreadMessage(“Async Thread”);
25 Thread.Sleep(两千); //虚拟异步工作
26 return “Hello ” + name;
27 }
28
29 //展现当前线程
30 static void ThreadMessage(string data)
31 {
32 string message = string.Format(“{0}\n ThreadId is:{1}”,
33 data,Thread.CurrentThread.ManagedThreadId);
34 Console.WriteLine(message);
35 }
36 }

B 定义A的实例并 注册事件

运作结果:

A首先注脚 委托和事件

1 class Program
2 {
3 delegate string MyDelegate(string name);
4
5 static void Main(string[] args)
6 {
7 ThreadMessage(“Main Thread”);
8
9 //建立法委员会委员托
10 MyDelegate myDelegate = new MyDelegate(Hello);
11 //异步调用委托,获取总结结果
12 IAsyncResult result=myDelegate.BeginInvoke(“Leslie”, null, null);
13 //在异步线程未形成前举行其余工作
14 while (!result.IsCompleted)
15 {
16 Thread.Sleep(200); //虚拟操作
17 Console.WriteLine(“Main thead do work!”);
18 }
19 string data=myDelegate.EndInvoke(result);
20 Console.WriteLine(data);
21
22 Console.ReadKey();
23 }
24
25 static string Hello(string name)
26 {
27 ThreadMessage(“Async Thread”);
28 Thread.Sleep(2000);
29 return “Hello ” + name;
30 }
31
32 static void ThreadMessage(string data)
33 {
34 string message = string.Format(“{0}\n ThreadId is:{1}”,
35 data,Thread.CurrentThread.ManagedThreadId);
36 Console.WriteLine(message);
37 }
38 }

停顿当前线程,抛出ThreadAbortException
相当,万分参数ExceptionState为object

威尼斯人娱乐 8

          //同等方法实现上述操作

   

可传参数,可获取重回值,可跟踪线程状态,线程停止后可回调钦命方法,并可含蓄自定义参数

威尼斯人娱乐 9

号外引申:

威尼斯人娱乐 10

Thread.CurrentThread.Abort(object);

威尼斯人娱乐 11

威尼斯人娱乐 12

威尼斯人娱乐 13

2.2  System.Threading 命名空间

透过轮询情势,使用IsCompleted属性判断异步操作是不是成功,那样在异步操作未到位前就能够让主线程执行别的的干活。

   

   

1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //把CL昂Cora线程池的最大值设置为一千
6 ThreadPool.SetMaxThreads(1000, 1000);
7 //突显主线程运行时线程池新闻
8 ThreadMessage(“Start”);
9 //运维工我线程
10 ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncCallback));
11 Console.ReadKey();
12 }
13
14 static void AsyncCallback(object state)
15 {
16 Thread.Sleep(200);
17 ThreadMessage(“AsyncCallback”);
18 Console.WriteLine(“Async thread do work!”);
19 }
20
21 //显示线程现状
22 static void ThreadMessage(string data)
23 {
24 string message = string.Format(“{0}\n CurrentThreadId is {1}”,
25 data, Thread.CurrentThread.ManagedThreadId);
26 Console.WriteLine(message);
27 }
28 }

引言

八 、计时器与锁

   

   

威尼斯人娱乐 14

1 static void Main(string[] args)
2 {
3 Thread thread = Thread.CurrentThread;
4 thread.Name = “Main Thread”;
5 string threadMessage = string.Format(“Thread ID:{0}\n Current
AppDomainId:{1}\n “+
6 “Current ContextId:{2}\n Thread Name:{3}\n “+
7 “Thread State:{4}\n Thread Priority:{5}\n”,
8 thread.ManagedThreadId, Thread.GetDomainID(),
Thread.CurrentContext.ContextID,
9 thread.Name, thread.ThreadState, thread.Priority);
10 Console.WriteLine(threadMessage);
11 Console.ReadKey();
12 }

使用轮询格局来检查和测试异步方法的图景不行艰苦,而且效用不高,有见及此,.NET为
IAsyncResult BeginInvoke(AsyncCallback ,
object)准备了一个回调函数。使用 AsyncCallback
就能够绑定1个方法作为回调函数,回调函数必须是带参数 IAsyncResult
且无重返值的办法: void AsycnCallbackMethod(IAsyncResult result)
。在BeginInvoke方法成功后,系统就会调用AsyncCallback所绑定的回调函数,最终回调函数中调用
XXX EndInvoke(IAsyncResult result)
就能够了结异步方法,它的回到值类型与寄托的再次回到值一致。

威尼斯人娱乐 15

壹 、线程的概念

   

回去目录

 
鉴于本文是以介绍二十四线程技术为核心,对进度、应用程序域的牵线就到此结束。关于进度、线程、应用程序域的技术,在”C#汇总揭秘——细说进度、应用程序域与上下文“会有详细介绍。

2.1.3 线程的气象

2.1 System.Threading.Thread类

经过ThreadState能够检查和测试线程是地处Unstarted、Sleeping、Running
等等状态,它比 IsAlive 属品质提供越来越多的一定新闻。

通过ThreadPool.QueueUserWorkItem运营工笔者线程即使是方便人民群众,但WaitCallback委托指向的总得是1个暗含Object参数的无重临值方法,那活脱脱是一种范围。若方法供给有重临值,可能隐含三个参数,那将多费周折。有见及此,.NET提供了另一种办法去建立工笔者线程,那便是寄托。

方法名称

说明

Abort()    

终止本线程。

GetDomain()

返回当前线程正在其中运行的当前域。

GetDomainId()

返回当前线程正在其中运行的当前域Id。

Interrupt()

中断处于 WaitSleepJoin 线程状态的线程。

Join()

已重载。 阻塞调用线程,直到某个线程终止时为止。

Resume()

继续运行已挂起的线程。

Start()  

执行本线程。

Suspend()

挂起当前线程,如果当前线程已属于挂起状态则此不起作用

Sleep()  

把正在运行的线程挂起一段时间。

委托类包括以下多少个重庆大学艺术

威尼斯人娱乐 16

威尼斯人娱乐 17

4.2 工我线程与I/O线程

1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //把线程池的最大值设置为一千
6 ThreadPool.SetMaxThreads(1000, 1000);
7
8 ThreadMessage(“Start”);
9 ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncCallback),”Hello
Elva”);
10 Console.ReadKey();
11 }
12
13 static void AsyncCallback(object state)
14 {
15 Thread.Sleep(200);
16 ThreadMessage(“AsyncCallback”);
17
18 string data = (string)state;
19 Console.WriteLine(“Async thread do work!\n”+data);
20 }
21
22 //呈现线程现状
23 static void ThreadMessage(string data)
24 {
威尼斯人娱乐,25 string message = string.Format(“{0}\n CurrentThreadId is {1}”,
26 data, Thread.CurrentThread.ManagedThreadId);
27 Console.WriteLine(message);
28 }
29 }

归来目录

Thread
中归纳了五个艺术来决定线程的始建、挂起、甘休、销毁,以往来的例证中会常常应用。

1 namespace Test
2 {
3 class Program
4 {
5 delegate string MyDelegate(string name);
6
7 static void Main(string[] args)
8 {
9 ThreadMessage(“Main Thread”);
10
11 //建立法委员会委员托
12 MyDelegate myDelegate = new MyDelegate(Hello);
13
14 //异步调用委托,获取总计结果
15 IAsyncResult result=myDelegate.BeginInvoke(“Leslie”, null, null);
16
17 while (!result.AsyncWaitHandle.WaitOne(200))
18 {
19 Console.WriteLine(“Main thead do work!”);
20 }
21 string data=myDelegate.EndInvoke(result);
22 Console.WriteLine(data);
23
24 Console.ReadKey();
25 }
26
27 static string Hello(string name)
28 {
29 ThreadMessage(“Async Thread”);
30 Thread.Sleep(2000);
31 return “Hello ” + name;
32 }
33
34 static void ThreadMessage(string data)
35 {
36 string message = string.Format(“{0}\n ThreadId is:{1}”,
37 data,Thread.CurrentThread.ManagedThreadId);
38 Console.WriteLine(message);
39 }
40 }

威尼斯人娱乐 18

威尼斯人娱乐 19

   

威尼斯人娱乐 20

本文首要从线程的基础用法,CL昂科威线程池当湖北中华工程公司作者线程与I/O线程的付出,并行操作PLINQ等四个方面介绍多线程的开发。
里面委托的BeginInvoke方法以及回调函数最为常用。

I/O线程或者不难蒙受大家的不经意,其实在支付四线程系统,更应该多留意I/O线程的操作。尤其是在ASP.NET开发在那之中,恐怕更两人只会专注在客户端应用Ajax可能在劳务器端使用UpdatePanel。其实入情入理施用I/O线程在报纸发表项目或文件下载时,能尽量地回落IIS的压力。
交互编程是Framework4.0中奋力推广的异步操作办法,更值得更透彻地读书。
期待本篇小说能对各位的就学讨论具有辅助,在那之中有所错漏的地点敬请点评。

1 public class MyDelegate:MulticastDelegate
2 {
3 public MyDelegate(object target, int methodPtr);
4 //调用委托方法
5 public virtual void Invoke();
6 //异步委托
7 public virtual IAsyncResult BeginInvoke(AsyncCallback callback,object
state);
8 public virtual void EndInvoke(IAsyncResult result);
9 }

威尼斯人娱乐 21

ParameterizedThreadStart委托与ThreadStart委托万分相似,但ParameterizedThreadStart委托是面向带参数方法的。注意ParameterizedThreadStart
对应措施的参数为object,此参数能够为3个值对象,也能够为一个自定义对象。

   

威尼斯人娱乐 22

威尼斯人娱乐 23

目录

1 class Program
2 {
3 public class Person
4 {
5 public string Name;
6 public int Age;
7 }
8
9 delegate string MyDelegate(string name);
10
11 static void Main(string[] args)
12 {
13 ThreadMessage(“Main Thread”);
14
15 //建立法委员会委员托
16 MyDelegate myDelegate = new MyDelegate(Hello);
17
18 //建立Person对象
19 Person person = new Person();
20 person.Name = “Elva”;
21 person.Age = 27;
22
23 //异步调用委托,输入参数对象person, 获取总计结果
24 myDelegate.BeginInvoke(“Leslie”, new AsyncCallback(Completed),
person);
25
26 //在开发银行异步线程后,主线程可以一连做事而不供给拭目以俟
27 for (int n = 0; n < 6; n++)
28 Console.WriteLine(” Main thread do work!”);
29 Console.WriteLine(“”);
30
31 Console.ReadKey();
32 }
33
34 static string Hello(string name)
35 {
36 ThreadMessage(“Async Thread”);
37 Thread.Sleep(2000);
38 return “\nHello ” + name;
39 }
40
41 static void Completed(IAsyncResult result)
42 {
43 ThreadMessage(“Async Completed”);
44
45 //获取委托对象,调用EndInvoke方法获得运转结果
46 AsyncResult _result = (AsyncResult)result;
47 MyDelegate myDelegate = (MyDelegate)_result.AsyncDelegate;
48 string data = myDelegate.EndInvoke(_result);
49 //获取Person对象
50 Person person = (Person)result.AsyncState;
51 string message = person.Name + “‘s age is ” +
person.Age.ToString();
52
53 Console.WriteLine(data+”\n”+message);
54 }
55
56 static void ThreadMessage(string data)
57 {
58 string message = string.Format(“{0}\n ThreadId is:{1}”,
59 data, Thread.CurrentThread.ManagedThreadId);
60 Console.WriteLine(message);
61 }
62 }

能够看出,主线在调用BeginInvoke方法可以继续执行其余命令,而无需再伺机了,那确实比选取轮询格局判断异步方法是不是形成更有优势。
在异步方法执行到位后将会调用AsyncCallback所绑定的回调函数,注意一点,回调函数依旧是在异步线程中实施,那样就不会潜移默化主线程的周转,那也运用回调函数最值得青昧的地点。
在回调函数中有二个既定的参数IAsyncResult,把IAsyncResult强制转换为AsyncResult后,就足以透过
AsyncResult.AsyncDelegate
获取原委托,再利用EndInvoke方法获得总结结果。
运作结果如下:

③ 、以ThreadStart格局完成二十八线程

它包涵以下常用公共性质:

威尼斯人娱乐 24

威尼斯人娱乐 25

在上述例子中得以瞥见,若是在运用myDelegate.BeginInvoke后立刻调用myDelegate.EndInvoke,那在异步线程未到位工作从前主线程将处于阻塞状态,等到异步线程截至获取计算结果后,主线程才能持续做事,那明摆着力不从心体现出三十二线程的优势。此时能够能够利用IAsyncResult
进步主线程的干活性质,IAsyncResult有以下成员:

   

3.5 Suspend 与 Resume (慎用)

当调用Invoke()方法时,对应此委托的拥有办法都会被执行。而BeginInvoke与EndInvoke则帮忙委托方法的异步调用,由BeginInvoke运转的线程都属于CL帕杰罗线程池中的工小编线程,在上面将详细表明。

ManagedThreadId是认同线程的唯一标识符,程序在多数境况下都以经过Thread.ManagedThreadId来识别线程的。而Name是一个可变值,在暗中认可时候,Name为一个空值
Null,开发人士能够因此程序设置线程的称谓,但那只是二个帮衬作用。

威尼斯人娱乐 26

4.1 关于CLR线程池

.NET为线程设置了Priority属性来定义线程执行的预先级别,里面富含七个挑选,在那之中Normal是私下认可值。除非系统有特殊供给,不然不应该随便设置线程的先行级别。

   

应用程序域(AppDomain)是2个程序运行的逻辑区域,它能够算得2个轻量级的进度,.NET的顺序集正是在选取程序域中运作的,3个进程可以分包有八个利用程序域,1个运用程序域也足以涵盖三个程序集。在一个行使程序域中富含了三个或多少个左右文context,使用前后文CL途乐就可见把一些特殊对象的情景放置在不一致容器在那之中。

请留心运维结果,在调用Thread.Start()方法后,系统以异步方式运维Message.ShowMessage(),而主线程的操作是继续执行的,在Message.ShowMessage()实现前,主线程已到位有着的操作。

1 public class Message
2 {
3 public void ShowMessage()
4 {
5 string message = string.Format(“Async threadId is :{0}”,
6 Thread.CurrentThread.ManagedThreadId);
7 Console.WriteLine(message);
8
9 for (int n = 0; n < 10; n++)
10 {
11 Thread.Sleep(300);
12 Console.WriteLine(“The number is:” + n.ToString());
13 }
14 }
15 }
16
17 class Program
18 {
19 static void Main(string[] args)
20 {
21 Console.WriteLine(“Main threadId is:”+
22 Thread.CurrentThread.ManagedThreadId);
23 Message message=new Message();
24 Thread thread = new Thread(new ThreadStart(message.ShowMessage));
25 thread.Start();
26 Console.WriteLine(“Do something ……….!”);
27 Console.WriteLine(“Main thread working is complete!”);
28
29 }
30 }

   

威尼斯人娱乐 27

   

1 class Program
2 {
3 delegate void MyDelegate();
4
5 static void Main(string[] args)
6 {
7 MyDelegate delegate1 = new MyDelegate(AsyncThread);
8 //展现委托类的多少个点子成员
9 var methods=delegate1.GetType().GetMethods();
10 if (methods != null)
11 foreach (MethodInfo info in methods)
12 Console.WriteLine(info.Name);
13 Console.ReadKey();
14 }
15 }

1 class Program
2 {
3 delegate string MyDelegate(string name);
4
5 static void Main(string[] args)
6 {
7 ThreadMessage(“Main Thread”);
8
9 //建立法委员会委员托
10 MyDelegate myDelegate = new MyDelegate(Hello);
11
12 //异步调用委托,获取总计结果
13 IAsyncResult result=myDelegate.BeginInvoke(“Leslie”, null, null);
14
15 //此处可投入多少个检查和测试对象
16 WaitHandle[] waitHandleList = new WaitHandle[] {
result.AsyncWaitHandle,…….. };
17 while (!WaitHandle.WaitAll(waitHandleList,200))
18 {
19 Console.WriteLine(“Main thead do work!”);
20 }
21 string data=myDelegate.EndInvoke(result);
22 Console.WriteLine(data);
23
24 Console.ReadKey();
25 }
26
27 static string Hello(string name)
28 {
29 ThreadMessage(“Async Thread”);
30 Thread.Sleep(2000);
31 return “Hello ” + name;
32 }
33
34 static void ThreadMessage(string data)
35 {
36 string message = string.Format(“{0}\n ThreadId is:{1}”,
37 data,Thread.CurrentThread.ManagedThreadId);
38 Console.WriteLine(message);
39 }
40 }

威尼斯人娱乐 28

Thread.Suspend()与 Thread.Resume()是在Framework1.0
就已经存在的老方法了,它们分别可以挂起、苏醒线程。但在Framework2.0中就已经鲜明排斥那七个方法。那是因为借使有些线程占用了已有个别财富,再采纳Suspend()使线程短期处在挂起状态,当在别的线程调用那个财富的时候就会挑起死锁!所以在尚未必要的景观下相应幸免采纳那多少个章程。

按 Ctrl+C 复制代码

System.Threading.Thread是用以控制线程的基本功类,通过Thread可以决定当前使用程序域中线程的创办、挂起、停止、销毁。

   

   

威尼斯人娱乐 29

威尼斯人娱乐 30

   

   

   

威尼斯人娱乐 31

2.1.2 线程的事先级别

② 、线程的基础知识

威尼斯人娱乐 32

但系统不也许预见异步线程供给周转的岁月,所以用经过Thread.Sleep(int)阻塞主线程并不是三个好的化解方法。有见及此,.NET专门为等候异步线程达成支付了另1个主意thread.Join()。把上边例子中的最后一行Thread.Sleep(6000)修改为
thread.Join() 就能确认保障主线程在异步线程thread运转甘休后才会终止。

   

威尼斯人娱乐 33

转载:http://www.cnblogs.com/leslies2/archive/2012/02/07/2310495.html\#undefined

4.5  利用BeginInvoke与EndInvoke达成异步委托方法

以下那个例子,就是经过Thread展现当前线程新闻

在单CPU系统的二个单位时间(time
slice)内,CPU只好运营单个线程,运转顺序取决于线程的先期级别。假若在单位时间内线程未能达成实施,系统就会把线程的气象音讯保存到线程的地面存储器(TLS)
中,以便下次执行时上升执行。而二十多线程只是系统带来的贰个假像,它在多少个单位时间内开始展览三个线程的切换。因为切换频密而且单位时间十分长暂,所以十六线程可被视作同时运转。

威尼斯人娱乐 34

   

   

4.7 回调函数

威尼斯人娱乐 35

威尼斯人娱乐 36

进程、应用程序域、线程的关系如下图,2个历程内足以归纳三个利用程序域,也有蕴涵四个线程,线程也能够不停于多少个应用程序域当中。但在同二个时刻,线程只会处于多少个用到程序域内。

3.4 挂起线程

运营结果

此间先以叁个例证显示一下二十八线程带来的利益,首先在Message类中国建工业总会公司立八个方法ShowMessage(),里面展现了眼下运作线程的Id,并行使Thread.Sleep(int
)
方法模拟部分工作。在main()中经过ThreadStart委托绑定Message对象的ShowMessage()方法,然后通过Thread.Start()执行异步方法。

贰 、线程的基础知识

运行结果如下

   

ThreadPool线程池中涵盖有五个静态方法能够直接开发银行工小编线程:
一为 ThreadPool.QueueUserWorkItem(WaitCallback)
二为 ThreadPool.QueueUserWorkItem(WaitCallback,Object) 

运作结果

   

除此以外,也能够动用WailHandle达成同样的做事,WaitHandle里面含有有1个主意WaitOne(int
timeout),它可以判断委托是还是不是成功工作,在做事未成功前主线程能够一而再别的工作。运维上面代码可获取与运用
IAsyncResult.IsCompleted 同样的结果,而且更简单方便 。

运行结果如下,此时选用程序域将在主线程运维5秒后活动终止

委托

说明

ContextCallback

表示要在新上下文中调用的方法。

ParameterizedThreadStart

表示在 Thread 上执行的方法。

ThreadExceptionEventHandler

表示将要处理 Application 的 ThreadException 事件的方法。

ThreadStart

表示在 Thread 上执行的方法。

TimerCallback

表示处理来自 Timer 的调用的方法。

WaitCallback

表示线程池线程要执行的回调方法。

WaitOrTimerCallback

表示当 WaitHandle 超时或终止时要调用的方法。

威尼斯人娱乐 37

进度(Process)是Windows系统中的叁个基本概念,它涵盖着一个周转程序所急需的财富。进程之间是相对独立的,三个进程不能够访问另1个进度的多寡(除非动用分布式计算格局),叁个经过运转的波折也不会影响别的进度的周转,Windows系统就是接纳进度把工作划分为八个独立的区域的。进度能够知道为贰个顺序的骨干边界。

至极选取八线程能增强系统的属性,比如:在系统请求大容积的数额时采用三十二线程,把多少输出工作交给异步线程,使主线程保持其安居去处理任何题材。但须要专注一点,因为CPU要求花费不少的时间在线程的切换上,所以重重地应用八线程反而会促成质量的下降。

   

⑤ 、CL纳瓦拉线程池的I/O线程

   

威尼斯人娱乐 38

类    

说明

AutoResetEvent

通知正在等待的线程已发生事件。无法继承此类。

ExecutionContext

管理当前线程的执行上下文。无法继承此类。

Interlocked

为多个线程共享的变量提供原子操作。

Monitor

提供同步对对象的访问的机制。

Mutex

一个同步基元,也可用于进程间同步。

Thread

创建并控制线程,设置其优先级并获取其状态。

ThreadAbortException

在对 Abort 方法进行调用时引发的异常。无法继承此类。

ThreadPool

提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

Timeout

包含用于指定无限长的时间的常数。无法继承此类。

Timer

提供以指定的时间间隔执行方法的机制。无法继承此类。

WaitHandle

封装等待对共享资源的独占访问的操作系统特定的对象。

3.1 使用ThreadStart委托

2.1.5 开发实例

当定义委托后,.NET就会自行创造2个象征该信托的类,上面能够用反射方式显示委托类的法子成员(对反射有趣味的朋友能够先参考一下”.NET基础篇——反射的奥妙“)

假诺想为回调函数字传送送一些表面新闻,就能够运用BeginInvoke(AsyncCallback,object)的最后一个参数object,它同意外部向回调函数输入任何类型的参数。只需求在回调函数中选取AsyncResult.AsyncState 就足以拿走object对象。

   

采取 ThreadPool.QueueUserWorkItem(WaitCallback,Object)
方法能够把object对象作为参数字传送送到回调函数中。
上面例子中便是把2个string对象作为参数发送到回调函数当中。

 1. 1 经过、应用程序域与线程的关系

若想终止正在运营的线程,可以动用Abort()方法。在动用Abort()的时候,将引发1个特有十分ThreadAbortException 。
若想在线程终止前复苏线程的进行,能够在抓获格外后
,在catch(ThreadAbortException ex){…}
中调用Thread.ResetAbort()撤废终止。
而选用Thread.Join()可以保障应用程序域等待异步线程甘休后才告一段落运维。

   

威尼斯人娱乐 39

1 public interface IAsyncResult
2 {
3 object AsyncState {get;}
//获取用户定义的靶子,它界定或蕴含关于异步操作的新闻。
4 WailHandle AsyncWaitHandle {get;} //获取用于等待异步操作完结的
WaitHandle。
5 bool CompletedSynchronously {get;}
//获取异步操作是还是不是同步达成的提示。
6 bool IsCompleted {get;} //获取异步操作是或不是已成功的指令。
7 }

先把WaitCallback委托指向3个含有Object参数的无重临值方法,再使用
ThreadPool.QueueUserWorkItem(WaitCallback)
就足以异步运维此办法,此时异步方法的参数被视为null 。

在System.Threading中的包括了下表中的多个常用委托,当中ThreadStart、ParameterizedThreadStart是最常用到的信托。
由ThreadStart生成的线程是最直白的法子,但由ThreadStart所生成并不受线程池管理。
而ParameterizedThreadStart是为异步触发带参数的主意而设的,在下一节将为我们逐一细说。

首先建立三个寄托对象,通过IAsyncResult BeginInvoke(string
name,AsyncCallback callback,object state) 异步调用委托方法,BeginInvoke
方法除最终的多少个参数外,其余参数都是与艺术参数绝对应的。通过 BeginInvoke
方法将重回一个完毕了 System.IAsyncResult
接口的对象,之后就足以行使EndInvoke(IAsyncResult )
方法就能够终结异步操作,获取委托的运作结果。

按 Ctrl+C 复制代码

   

威尼斯人娱乐 40

为了等待别的后台线程达成后再甘休主线程,就足以行使Thread.Sleep()方法。

线程(Thread)是进度中的基本进行单元,在进度入口实施的第②个线程被视为那个进度的主线程。在.NET应用程序中,都以以Main()方法作为入口的,当调用此情势时系统就会自行成立3个主线程。线程首假若由CPU寄存器、调用栈和线程本地存款和储蓄器(Thread
Local
Storage,TLS)组成的。CPU寄存器首要记录当前所执行线程的场馆,调用栈主要用以维护线程所调用到的内部存款和储蓄器与数量,TLS首要用于存放线程的气象新闻。

应用CL翼虎线程池的劳力线程一般有二种艺术,一是一向通过
ThreadPool.QueueUserWorkItem() 方法,二是因而委托,上面将逐一细说。

运维结果

1 public class Message
2 {
3 public void ShowMessage()
4 {
5 string message = string.Format(“\nAsync threadId is:{0}”,
6 Thread.CurrentThread.ManagedThreadId);
7 Console.WriteLine(message);
8 for (int n = 0; n < 10; n++)
9 {
10 Thread.Sleep(300);
11 Console.WriteLine(“The number is:” + n.ToString());
12 }
13 }
14 }
15
16 class Program
17 {
18 static void Main(string[] args)
19 {
20 Console.WriteLine(“Main threadId is:”+
21 Thread.CurrentThread.ManagedThreadId);
22
23 Message message=new Message();
24 Thread thread = new Thread(new ThreadStart(message.ShowMessage));
25 thread.IsBackground = true;
26 thread.Start();
27
28 Console.WriteLine(“Do something ……….!”);
29 Console.WriteLine(“Main thread working is complete!”);
30 Console.WriteLine(“Main thread sleep!”);
31 Thread.Sleep(5000);
32 }
33 }

4.6  善用IAsyncResult

威尼斯人娱乐 41

   

相关文章