.Net 多线程

今天我想拿出我对多线程的理解和大家来学习一下.net framework之下是如何完成的。

System.Threading:

基本上与线程相关的信息,也就在这个命名空间里可以找的了。

1. 如何创建一个线程。

     public   class  TestThread
    

        
private int[] PublicResource = new int[100];
        
private void ThreadFunc()
        
{
            
for(int i = 0; i< 100; i++)
            
{
                
lock(PublicResource)
                
{
                    PublicResource[i] 
= i + 1;
                }

            }

        }

        
public void GetThread()
        
{
            Thread _Thread 
= new Thread(new ThreadStart(ThreadFunc));
        }


        
private Thread _Thread = null;
        
public void StartThread()
        
{
            GetThread();
            _Thread.Start();
        }


        
public void StopThread()
        
{
            
if (_Thread != null && _Thread.IsAlive)
            
{
                _Thread.Abort();
                _Thread.Join();
            }

            
        }

    }

记住在传给线程构造函数的参数是一个委托,尽管在net.20里将函数指针直接作为参数传递,但是我不建议大家这么做,而且,你如果你看生成IL代码,你也会发现.net2.0其实也是在内部用委托封装了的,因为CLR规范根本就不允许函数指针这样的不安全带码,即便要有也必须有unsafe关键字指明。

2. 如何启动一个线程

利用方法Start函数就可以直接启动

3. 如何终止?

看到_Thread.Abort()了吗?这个方法将在线程内部引发一个异常ThreadAbortException,终止进程,而Join()方法将会等待,直到线程结束。

现在你已经学会了如何创建,启动和停止线程,然而,这些只是最最基本的知识,下面我们将一起学习如何同步一个线程,.net framework提供很多种方法来同步线成,比如上面代码里的lock关键字就是一种较为简单并且很实用的方式。lock关键字将保护程序块在在执行的时候免受其他线程的干扰。对于他的更多信息你可以参考MSDN,因为这里我只准备介绍一些基本的知识。

类似的还有如InnerLock等等,这里我想主要介绍一下信号量的使用方法:

a. AutoRestEvent:

    通知正在等待的线程事件已经发生。

线程通过调用 AutoResetEvent 上的WiteOne来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程通过调用Set发出资源可用的信号。

调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。

AutoResetEvent 也可以同 staticWaiteAll  和WaiteAny 方法一起使用。

b. MannualResetEvent

通知一个或多个正在等待的线程已发生事件.

与AutoRestEvent不同的是,它必须人为的设置信号量。

恩,写不动了,下次继续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值