2012-02-20 95 views
0

我想解決這個問題。我有WCF服務。客戶端可以從該服務調用Web方法,該方法僅在另一個線程中「激發」另一種方法(此方法僅將數據寫入數據庫)。WCF中的多線程

代碼是在這裏:

//this method will write data to database 
    public void WriteToDb() 
    { 

    } 

    //this web method will call only mehod WriteToDb() in another thread 
    public void SomeWebMethod() 
    { 
     new Task(WriteToDb).Start(); 

    } 

問題是,在同一時間可以通過Web方法調用5個客戶端。這導致該方法WriteToDb在5個線程中被調用5次。

在所有5種情況下,方法WriteToDb將使用相同的數據。

我的目標是實現這種行爲。 5個客戶端稱爲Web方法SomeWebMethod。方法WriteToDb將在5個線程中運行。

但我想執行第一個線程,然後第二個線程....等,並在第五個線程結束。

我不想在5個線程中同時運行方法WriteToDb。

所以,也許我可以使用鎖定。

{ 
    private object locker = new object(); 

    //this method will write data to database 
    public void WriteToDb() 
    { 

     lock(locker) 
     { 
      //write to DB 
     } 

    } 

我不確定,因爲.net程序集是應用程序域上的主機,應用程序域是主機上的win程序。我想避免僵局。

如果我有6 CPU的機器會發生什麼?使用互斥鎖而不是鎖定?

感謝您的幫助...

回答

0

鎖是在這裏很好,但你應該讓你的locker對象static所以同一個對象實例被鎖定每次使用。

無論你擁有多少核心 - 如果你持有對象上的鎖定,那麼任何其他嘗試獲取該鎖定的線程都將等待鎖定釋放。

只有在不同線程中以不同順序獲取多個鎖時纔會發生死鎖。

我建議你閱讀喬阿爾巴哈利的優秀free ebook

+0

非常感謝你 – arva 2012-02-23 06:58:36

0

我不是格外知道你正在寫入數據庫,但是你的問題是鬆散的WCF耦合到坦率地說,嘗試讀通過C#CLR上多線程等

另外關於WCF,你可以設置你的服務對象是如何根據請求創建的,也就是每次調用,每個會話或單例,以及稍後用於指定方法是否卡在隊列中或將在對象上同時調用。

因此,根據選擇的體系結構,您可以在WCF上繼承承載單個對象的能力,該對象將具有您描述的邏輯,或者您可以嘗試嘗試。

鏈接

http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

http://msdn.microsoft.com/en-us/library/ms731193.aspx

+0

感謝您的幫助:) – arva 2012-02-23 06:59:32