多线程WCF环境线程中的扩展类是否安全?

时间:2013-12-06 07:07:38

标签: multithreading wcf thread-safety msmq

我有异步运行的不同产品突然间,我发现其他产品的详细信息最终会出现在另一个产品中。

当我将它传输到另一个服务时,我将它存储在XML中。

在:

运行
var transactionScopeOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted, Timeout = Timeout = new TimeSpan(0, 10, 0) };
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionScopeOptions))
{
    using (var dataContext = new FooContext())
    {
        /* code goes here, single instance of dataContext per thread */
    }
}

使用扩展类(出错的地方):

public static class FooExtensions
{
    public static int GetID(this FooClass foo)
    {
        var result = foo != null ? foo.ID : 0;
        return result;
    }
}

如果这不是线程安全的,如何使其线程安全?

修改

也可能是内存泄漏正在发生,但不确定。 使用WCF ConcurrencyMode.MultipleInstanceContextMode.Single

1 个答案:

答案 0 :(得分:1)

扩展方法与其他任何方法相比都具有线程安全性。它们只是常规静态方法之上的语法糖。实际上,您可以调用与foo.GetID()相同的方法,而不是FooExtensions.GetID(foo),而是执行相同的操作。这就是编译器真正为您做的事情。

根据您提供的示例,您的扩展方法是线程安全的。由于使用IsolationLevel.ReadUncommitted,您的问题更有可能发生。 ReadUncommitted可导致脏读,不可重复读,相同数据被读两次,以及幻像读。有关详细信息,请参阅this article。我建议提高你的隔离级别,看看是否会让你的问题消失。