-- 作者:admin
-- 发布时间:11/9/2004 2:26:00 AM
-- 管窥.net-----threads
发信人: walts (小天堂), 信区: DotNET 标 题: 管窥.net-----threads 发信站: BBS 水木清华站 (Wed May 9 11:04:30 2001) 在.Net中怎样创建一个线程? 很简单,先创建一个代表元对象ThredStart的实例,然后再创建一个 System.Threading.Thread类型对象,它的参数就是前面产生的代表元对象, 这样这个代表元就会在一个新的线程下运行。 举例如下: class MyThread { public MyThread( string initData ) { m_data = initData; m_thread = new Thread( new ThreadStart(ThreadMain) ); m_thread.Start(); } // ThreadMain() 将要在一个新线程下运行. private void ThreadMain() { Console.WriteLine( m_data ); } public void WaitUntilFinished() { m_thread.Join(); } private Thread m_thread; private string m_data; } 对于上面的例子,如果我们产生了一个MyThread类型对象,就会产生一个线程了。 而且这个线程从MyThread.ThreadMain开始执行。 MyThread t = new MyThread( "Hello, world." ); t.WaitUntilFinished(); 怎样停止一个线程? 有多种方法,最灵活的方法是我们可以写自己的通讯机制。但是,.Net中有两个现成的 类Thread.Interrupt和Thread.Abort对此提供支持。 使用ThreadInterrupt会从线程 内部引发一个ThreadInterruptedException异常,然后这个线程会自动进入 WaitJoinSleep状态。其实,使用这种方法让线程停止运行是最恰当的。 使用ThreadAbort会从线程内部引发一个ThreadAbortException, 但是最关键的是,在 正常情况下ThreadAbortException无法被捕获,对它要特别处理,我们一般不去使用。 怎样使用线程池? 把一个代表元WaitCallback的实例作为参数传递给ThreadPool.QueueUserWorkItem() 方法就可以了。 class CApp { static void Main() { string s = "Hello, World"; ThreadPool.QueueUserWorkItem( new WaitCallback( DoWork ), s ); Thread.Sleep( 1000 ); // Give time for work item to be executed } // DoWork is executed on a thread from the thread pool. static void DoWork( object state ) { Console.WriteLine( state ); } } 可以从线程外部查询线程的状态吗? 不能,但是可以让线程主动向外部发送信号通知自己的状态。使用事件机制就可以实现。 怎样在线程中访问临界区? 每个线程都有一个用于并发控制的锁。System.ThreadMonitor.Enter/Exit方法可以 用来请求和释放这个锁。 下面这个例子就给出如何一次只能有一个线程访问执行f()方法。 class C { public void f() { try { Monitor.Enter(this); ... } finally { Monitor.Exit(this); } } } 另外,C#还有一个lock关键字,这样就简化了上面的语法,如下: class C{ public void f() { lock(this) { ... } } } 注意,在以上的例子中,Monitor.Enter(myObject)并不意味着对myObject的访问串行化 (Serialized)了. 这仅仅表示使用myObject对象本身带有的用于同步控制的锁。把上面的 例子也可以这样改写: class C { public void f() { lock( m_object ) { ... } } private m_object = new object(); } -- ※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.142.76] 上一篇 返回上一页 回到目录 回到页首
|