C#多线程技术(一)
2010-02-21 23:44 ubunoon 阅读(560) 评论(0) 编辑 收藏 举报公司项目有可能采用C#编写,如果用到,必然会涉及到多线程技术,基本的概念都是相同的,差别是具体的代码。
在C#中,线程函数执行被封装在类中,通过类对象的Start函数启动线程执行函数。线程类Thread接受的是一个ThreadStart的delegate类型对象,具体代码应该如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6
7 namespace MultiThreadTest
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Thread thread1 = new Thread(
14 delegate()
15 {
16 Console.WriteLine("Hello Here!");
17 }
18 );
19 Thread thread2 = new Thread(
20 () => // lambda 表达式
21 {
22 Console.WriteLine("Well then goodbye!\n");
23 }
24 );
25
26 thread1.Start();
27 thread2.Start();
28 }
29 }
30 }
31
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6
7 namespace MultiThreadTest
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Thread thread1 = new Thread(
14 delegate()
15 {
16 Console.WriteLine("Hello Here!");
17 }
18 );
19 Thread thread2 = new Thread(
20 () => // lambda 表达式
21 {
22 Console.WriteLine("Well then goodbye!\n");
23 }
24 );
25
26 thread1.Start();
27 thread2.Start();
28 }
29 }
30 }
31
通常在多线程中,我们需要等待所有的线程都结束,系统才会等待运行退出。这个时候,可以调用线程对象的Join函数,该函数在线程达到尾部结束的时候,会进行线程返回。
当线程个数很多的时候,不带参数的Join函数需要多次调用,非常费时费劲,这个时候,可以调用带时间参数的Join函数,当超过时间后,系统强制结束线程运行,如下面的代码:
1 if ( !thread.Join(30000))
2 {
3 thread.Abort();
4 }
2 {
3 thread.Abort();
4 }
之前处理的线程函数,都无法对数据状态进行保存处理,这样,对于复杂应用显然不是特别适合,C#的Thread采用ThreadStart委托方式,可以很好的解决这个问题:
代码
1 class ThreadedTask{
2 string _whatToSay;
3 public ThreadedTask(string whatToSay){
4 _whatToSay = whatToSay;
5 }
6
7 public void MethodToRun(){
8 Console.WriteLine("I am babbling ( " + _whatToSay + " )");
9 }
10 }
11
12
13 ThreadedTask task = new ThreadedTask("hello");
14
15 Thread thread = new Thread(
16 new ThreadStart(task.MethodToRun)
17 );
18 thread.Start();
2 string _whatToSay;
3 public ThreadedTask(string whatToSay){
4 _whatToSay = whatToSay;
5 }
6
7 public void MethodToRun(){
8 Console.WriteLine("I am babbling ( " + _whatToSay + " )");
9 }
10 }
11
12
13 ThreadedTask task = new ThreadedTask("hello");
14
15 Thread thread = new Thread(
16 new ThreadStart(task.MethodToRun)
17 );
18 thread.Start();
字符串hello被存在类中,通过委托的方式将MethodToRun方法委托到线程内部,然后调用Start函数,这个时候,保存到类中的数据也可以被准确获取出来。
/*
*
* Copyright (c) 2011 Ubunoon.
* All rights reserved.
*
* email: netubu#gmail.com replace '#' to '@'
* http://www.cnblogs.com/ubunoon
* 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
* 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
*
* Copyright (c) 2011 Ubunoon.
* All rights reserved.
*
* email: netubu#gmail.com replace '#' to '@'
* http://www.cnblogs.com/ubunoon
* 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
* 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */