多線程與工作流程

來源:互聯網
上載者:User
 

本文不是講多線程,也不是講在多線程中使用工作流程什麼的,而是用設計多線程的思路講一下工作流程的工作思想。

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

在工作流程是對應的是什麼…….大家自已想吧,

你要想從一條流動的河中取出一瓢水,看完後想再將其放回源除,讓時間對這條河暫停吧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.