2011-11-29 103 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