2011-11-29 58 views
0

我有一個Web服務和一些方法,我不想使用下面的代碼,這工作正常,因爲我打算在靜態(我已閱讀)不是線程安全的多線程應用程序中使用它。如何使用匿名方法或匿名類型來減少此代碼?

因此,我現在所做的只是重複下面的靜態方法'returnisTrue()'中的代碼,在我的web服務方法「myWebMethod」的主體中,/// 1 of 3,//2的3,和//3 3.這工作正常,但導致代碼臃腫。有沒有更緊湊的方式,使用函數式編程或匿名方法,或者你可以使用哪些方法?

注意,當我嘗試在方法內部創建一個類時,編譯器會阻塞...這將解決我的問題。

正如我所說的代碼,我現在工作正常,但它臃腫,因爲我重複'靜態'方法'returnisTrue'三次。

謝謝。

編輯:在迴應一些關於使我的靜態方法線程安全的問題,我寧願不打擾,但爲了獲得解決方案的興趣,我包括下面。

所有這些代碼是在Web服務的服務器端

// I cannot unfortunately use this static method below--not thread safe 
static private bool returnisTrue() 
{ 
    bool isTrue = false; 
    // do a bunch of stuff here 
    return isTrue; 
} 

public bool myWebMethod (string XYZ) 
{ 
    //public Class myClassReturnisTrue { … } //will not compile 

    bool isTrueOrNot1 = returnisTrue(); //1 of 3 

    /// more code here 

    bool isTrueOrNot2 = returnisTrue(); //2 of 3 

    ///more code here 

    bool isTrueOrNot3 = returnisTrue(); //3 of 3 

    return isTrueOrNot1 && isTrueOrNot2 && isTrueOrNot3; 
} 
// here is the static method 'returnisTrue' it looks something like this: 


static private bool returnIsTrue(string A, string B) 
{ 
if (A.Length() < B.Length()) 
    { 
return true; 
    } 
else 
return false; 

} 
+0

爲什麼不重構'returnisTrue'是線程安全的? – Richard

+0

沒有足夠的信息 - 沒有任何看起來像可能的lambda或匿名類型 - 來解決標題中的問題。 – Richard

+0

@ Richard - 謝謝你的回覆。我認爲鎖具有性能成本 - 每秒會有數千次這種靜態方法被評估。從J. Kommer看來靜態方法是線程安全的。奇怪的是C#沒有簡單的內聯來解決這個問題。哦,這次我很幸運。 – PaulDecember

回答

3

你在靜態方法中實際做了什麼?你是在修改任何全局狀態還是隻在局部變量上工作?只要你採取適當的措施來確保你的代碼實際上是線程安全的,那麼使用靜態方法甚至變量都沒有問題。

靜態方法和實例方法都可能是不安全的,具體取決於您在其中執行的操作。要問的主要問題是,您訪問的是您的方法中多個線程之間可訪問的任何數據嗎?如果是這樣,爲什麼不改變你的方法是線程安全的(通過例如鎖定)。

看看.NET框架本身的例子,它包含各種靜態線程安全方法。

編輯:

好了,現在我們已經看到了你的方法 - 它確實是線程安全的了。該方法不訪問任何共享數據,並且字符串是immutable and inherently thread-safe as a result

+0

@ J.Kommer - 好的,看看我的編輯是否有100萬人訪問這個靜態方法是線程安全的? tx – PaulDecember

+0

@ J.Kommer - 非常感謝。事實上,它們是MyWebMethod的局部變量。這並不明顯,爲什麼它應該是線程安全的,但我會聽取您的意見,並且還會做更多的研究。從另一個評論看來,這是非常。方法作爲解決方案是不明確的,所以我會將你的回答標記爲答案。 – PaulDecember

+0

@J。Kommer-我不想讓它成爲字符串教程,但我聽說如果你在循環中,你應該使用新的Stringbuilder()而不是字符串,因爲字符串會佔用內存。然而,在這裏,我想我們並不是真的在循環中,即使每秒訪問數千次靜態方法,每次只創建一次不可變的字符串。 – PaulDecember