本文不是讲多线程,也不是讲在多线程中使用工作流什么的,而是用设计多线程的思路讲一下工作流的工作思想。
NET中的System.Threading.Thread的例子很简单,以至于许多程序员只学了几个小时就以为自已会多线程开发的。没有直正写过多线程的人是无法体会多线程是多么的…..
很多人上手WF总是觉得一些功能的实现有些怪,特另是宿主与实例或实例与实例通信这部分。
我用多线程的思路讲一下:
(注:如果你对Abort与Interrupt方法非常了解,本文对你来说没有什么技术上的意义)
Abort,强行终止线程
class 要参与多线程的类 { public void 方法() { int i = 0; try { while (i<3000) { i = i + 1; Console.WriteLine(i); } } catch (ThreadInterruptedException e) { Console.WriteLine("由Interrupt方法引发的: " + e.Message);} } } |
Thread 线程对象= new Thread((new 要参与多线程的类()).方法); 线程对象.Start(); System.Threading.Thread.Sleep(600); //一毫秒在多线程中也是有其作用的,因为他表示一次停顿 线程对象.Abort(); Console.WriteLine("主线程完成"); Console.Read(); |
线程对象.Abort();方法会硬生生的将线程终止,如while中的i循环到234就被终止了 这样很不好,特别是在对资操作时。而且无法捕获到异常 |
Interrupt,当线程不再做任何有意义的工作时,终止线程
class 要参与多线程的类 { public void 方法() { int i = 0; try { while (i<5000) { i = i + 1; Console.WriteLine(i); } } catch (ThreadInterruptedException e) { Console.WriteLine("由Interrupt方法引发的: " + e.Message);} } } |
Thread 线程对象= new Thread((new 要参与多线程的类()).方法); 线程对象.Start(); System.Threading.Thread.Sleep(600); //一毫秒在多线程中也是有其作用的,因为他表示一次停顿 线程对象.Interrupt(); Console.WriteLine("主线程完成"); Console.Read(); |
不会终止上例,因为上例的线程从来都没进入过WaitJoinSleep状态,当然也不会产生异常 |
class 要参与多线程的类 { public void 方法() { int i = 0; try { while (i<5000) { System.Threading.Thread.Sleep(1); i = i + 1; Console.WriteLine(i); } } catch (ThreadInterruptedException e) { Console.WriteLine("由Interrupt方法引发的: " + e.Message);} } } |
Thread 线程对象= new Thread((new 要参与多线程的类()).方法); 线程对象.Start(); System.Threading.Thread.Sleep(600); //一毫秒在多线程中也是有其作用的,因为他表示一次停顿 线程对象.Interrupt(); Console.WriteLine("主线程完成"); Console.Read(); |
由于添加了 System.Threading.Thread.Sleep(1);,线程会进入WaitJoinSleep状态,线程对象.Interrupt()生效,线程终止,可以捕获到异常,并可以异常中作一些收尾工作 |
还有这个
class 要参与多线程的类 { public void 方法() { int i = 0; try { while (i<5000) { i = i + 1; Console.WriteLine(i); } System.Threading.AutoResetEvent w = new AutoResetEvent(false); w.WaitOne(); Console.WriteLine("---"); } catch (ThreadInterruptedException e) { Console.WriteLine("由Interrupt方法引发的: " + e.Message);} } } |
AutoResetEvent与Thread.Sleep对Interrupt()方法性质一样 |
所以我在设计要参与多线程的方法时会类似可能会这样
Void 方法() { 逻辑代码单元1; System.Threading.Thread.Sleep(1) 逻辑代码单元2; System.Threading.AutoResetEvent w = new AutoResetEvent(false); w.WaitOne(); 逻辑代码单元3; System.Threading.Thread.Sleep(1) } |
我要与另一个线程正在使用的对象通信时,我会让那个线程被一个w.WaitOne()阻塞,当通信完成时w.Set(),让那个线程继续。
当然还会有lock的技巧,这里就不说了。
我要说的是
Thread.Sleep,AutoResetEvent,以及我所说的通信方式,
在工作流是对应的是什么…….大家自已想吧,
你要想从一条流动的河中取出一瓢水,看完后想再将其放回源除,让时间对这条河暂停吧