多线程与工作流

 

本文不是讲多线程,也不是讲在多线程中使用工作流什么的,而是用设计多线程的思路讲一下工作流的工作思想。

NET中的System.Threading.Thread的例子很简单,以至于许多程序员只学了几个小时就以为自已会多线程开发的。没有直正写过多线程的人是无法体会多线程是多么的..

很多人上手WF总是觉得一些功能的实现有些怪,特另是宿主与实例或实例与实例通信这部分。

我用多线程的思路讲一下:

(注:如果你对AbortInterrupt方法非常了解,本文对你来说没有什么技术上的意义)

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);}

    }

}

AutoResetEventThread.SleepInterrupt()方法性质一样

 

所以我在设计要参与多线程的方法时会类似可能会这样

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,以及我所说的通信方式,

在工作流是对应的是什么…….大家自已想吧,

你要想从一条流动的河中取出一瓢水,看完后想再将其放回源除,让时间对这条河暂停吧

posted @ 2006-11-17 20:25  WXWinter(冬)  阅读(4787)  评论(5编辑  收藏  举报