申请完域名如何建设网站,企业网站seo哪里好,python做网站用什么框架,普通网站建设多少钱C#多线程编程 一、使用线程的理由 1、可以使用线程将代码同其他代码隔离#xff0c;提高应用程序的可靠性。 2、可以使用线程来简化编码。 3、可以使用线程来实现并发执行。 二、基本知识 1、进程与线程#xff1a;进程作为操作系统执行程序的基本单位#xff0c;拥有应用程…C#多线程编程 一、使用线程的理由 1、可以使用线程将代码同其他代码隔离提高应用程序的可靠性。 2、可以使用线程来简化编码。 3、可以使用线程来实现并发执行。 二、基本知识 1、进程与线程进程作为操作系统执行程序的基本单位拥有应用程序的资源进程包含线程进程的资源被线程共享线程不拥有资源。 2、前台线程和后台线程通过Thread类新建线程默认为前台线程。当所有前台线程关闭时所有的后台线程也会被直接终止不会抛出异常。 3、挂起Suspend和唤醒Resume由于线程的执行顺序和程序的执行情况不可预知所以使用挂起和唤醒容易发生死锁的情况在实际应用中应该尽量少用。 4、阻塞线程Join阻塞调用线程直到该线程终止。 5、终止线程Abort抛出 ThreadAbortException 异常让线程终止终止后的线程不可唤醒。Interrupt抛出 ThreadInterruptException 异常让线程终止通过捕获异常可以继续执行。 6、线程优先级AboveNormal BelowNormal Highest Lowest Normal默认为Normal。 三、线程的使用 线程函数通过委托传递可以不带参数也可以带参数只能有一个参数可以用一个类或结构体封装参数。 namespace Test
{class Program{static void Main(string[] args){Thread t1 new Thread(new ThreadStart(TestMethod));Thread t2 new Thread(new ParameterizedThreadStart(TestMethod));t1.IsBackground true;t2.IsBackground true;t1.Start();t2.Start(hello);Console.ReadKey();}public static void TestMethod(){Console.WriteLine(不带参数的线程函数);}public static void TestMethod(object data){string datastr data as string;Console.WriteLine(带参数的线程函数参数为{0}, datastr);}}
} 四、线程池 由于线程的创建和销毁需要耗费一定的开销过多的使用线程会造成内存资源的浪费出于对性能的考虑于是引入了线程池的概念。线程池维护一个请求队列线程池的代码从队列提取任务然后委派给线程池的一个线程执行线程执行完不会被立即销毁这样既可以在后台执行任务又可以减少线程创建和销毁所带来的开销。 线程池线程默认为后台线程IsBackground。 namespace Test
{class Program{static void Main(string[] args){//将工作项加入到线程池队列中这里可以传递一个线程参数ThreadPool.QueueUserWorkItem(TestMethod, Hello);Console.ReadKey();}public static void TestMethod(object data){string datastr data as string;Console.WriteLine(datastr);}}
} 五、Task类 使用ThreadPool的QueueUserWorkItem()方法发起一次异步的线程执行很简单但是该方法最大的问题是没有一个内建的机制让你知道操作什么时候完成有没有一个内建的机制在操作完成后获得一个返回值。为此可以使用System.Threading.Tasks中的Task类。 构造一个TaskTResult对象并为泛型TResult参数传递一个操作的返回类型。 namespace Test
{class Program{static void Main(string[] args){TaskInt32 t new TaskInt32(n Sum((Int32)n), 1000);t.Start();t.Wait();Console.WriteLine(t.Result);Console.ReadKey();}private static Int32 Sum(Int32 n){Int32 sum 0;for (; n 0; --n)checked{ sum n;} //结果太大抛出异常return sum;}}
} 一个任务完成时自动启动一个新任务。一个任务完成后它可以启动另一个任务下面重写了前面的代码不阻塞任何线程。 namespace Test
{class Program{static void Main(string[] args){TaskInt32 t new TaskInt32(n Sum((Int32)n), 1000);t.Start();//t.Wait();Task cwt t.ContinueWith(task Console.WriteLine(The result is {0},t.Result));Console.ReadKey();}private static Int32 Sum(Int32 n){Int32 sum 0;for (; n 0; --n)checked{ sum n;} //结果溢出抛出异常return sum;}}
} 六、委托异步执行 委托的异步调用BeginInvoke() 和 EndInvoke() namespace Test
{public delegate string MyDelegate(object data);class Program{static void Main(string[] args){MyDelegate mydelegate new MyDelegate(TestMethod);IAsyncResult result mydelegate.BeginInvoke(Thread Param, TestCallback, Callback Param);//异步执行完成string resultstr mydelegate.EndInvoke(result);}//线程函数public static string TestMethod(object data){string datastr data as string;return datastr;}//异步回调函数public static void TestCallback(IAsyncResult data){Console.WriteLine(data.AsyncState);}}
} 七、线程同步 1原子操作Interlocked所有方法都是执行一次原子读取或一次写入操作。 2lock()语句避免锁定public类型否则实例将超出代码控制的范围定义private对象来锁定。 3Monitor实现线程同步 通过Monitor.Enter() 和 Monitor.Exit()实现排它锁的获取和释放获取之后独占资源不允许其他线程访问。 还有一个TryEnter方法请求不到资源时不会阻塞等待可以设置超时时间获取不到直接返回false。 4ReaderWriterLock 当对资源操作读多写少的时候为了提高资源的利用率让读操作锁为共享锁多个线程可以并发读取资源而写操作为独占锁只允许一个线程操作。 5事件Event类实现同步 事件类有两种状态终止状态和非终止状态终止状态时调用WaitOne可以请求成功通过Set将时间状态设置为终止状态。 1AutoResetEvent自动重置事件 2ManualResetEvent手动重置事件 6信号量Semaphore 信号量是由内核对象维护的int变量为0时线程阻塞大于0时解除阻塞当一个信号量上的等待线程解除阻塞后信号量计数1。 线程通过WaitOne将信号量减1通过Release将信号量加1使用很简单。 7互斥体Mutex 独占资源用法与Semaphore相似。 8跨进程间的同步 通过设置同步对象的名称就可以实现系统级的同步不同应用程序通过同步对象的名称识别不同同步对象。 作者阿凡卢 出处http://www.cnblogs.com/luxiaoxun/ 转载于:https://www.cnblogs.com/mjq5150/p/6273274.html