.NET 多线程1_基本操作
和Jave一样, .net从语言级别上支持了线程操作.
//—————–.NET 定义的线程的状态
System.Threading.ThreadState
System.Diagnostics.ThreadState
//——————–Thread 相关的class
System.Threading.Thread
System.Threading.ThreadStart
System.Threading.Timer
System.Threading.ThreadPool
//—————- Create Thread
Thread threadObj = new Thread(new ThreadStart(MyWorkerThreadMethod)); //此时state为 Unstarted.
threadObj.Start(); //注意,此时线程一定马上执行,OS会负责把线程从ready态设置到running态.
MyWorkerThreadMethod()要符合ThreadStart Delegate的格式: 无参数,无返回值.可以是静态方法.
//—————- 访问线程信息
Thread currentThreadObject =Thread.CurrentThread;
currentThreadObject.Name = "PrimaryThread";
//—————–操作线程
//—- 挂起
if (threadObject.ThreadState ==ThreadState.Running )
{
threadObject.Suspend();
}
//—- 恢复
if (threadObject.ThreadState ==ThreadState.Suspended )
{
threadObject.Resume();
}
//—- Sleep
Thread.Sleep(5000);
Thread.Sleep(TimeSpan.Infinite);
//—- 等待另一个线程结束
if(Thread.CurrentThread.GetHashCode() != threadObject.GetHashCode())
{
threadObject.Join();
//or threadObject.Join(1000);
}
//—- 结束线程
if (threadObject.IsAlive == true )
{
threadObject.Abort();
}
会引发一个ThreadAbortException Exception
//——————线程同步
保证在某一时刻,只能有一个线程访问某个数据块
private static readonly object lockObj = newobject();
Test obj = null;
lock(lockObj)
{
if(obj == null)
obj = new Test();
}
[*]引用一道网上流传的c#面试题:
调用test方法时i>10时是否会引起死锁?
public void test(int i)
{
lock(this)
{
if (i>10)
{
i - - ;
test(i);
}
}
}
我想不会,整个代码中没有哪一行要访问this的实例数据.
参考
Working with Threads in C# (2006.05.18)
http://aspalliance.com/846
Multithreading in .NET
http://www.codeproject.com/dotnet/multithread.asp
CLR 的线程池(Jeffrey Richter)
http://www.microsoft.com/china/MSDN/library/netFramework/netframework/NECLRT.mspx?mfr=true
http://msdn.microsoft.com/msdnmag/issues/03/06/NET/
利用.Net 线程池提高应用程序性能
http://edobnet.cnblogs.com/archive/2005/11/29/287094.html
.NET’s ThreadPool Class - Behind The Scenes
http://www.codeproject.com/csharp/threadtests.asp
ASP.NET 2.0 中的异步页
http://www.microsoft.com/china/msdn/library/webservices/asp.net/issuesWickedCodetoc.mspx?mfr=true
