以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  管窥.net-----threads  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11858)


--  作者: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]
上一篇
返回上一页
回到目录
回到页首



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms