我有异步运行的不同产品突然间,我发现其他产品的详细信息最终会出现在另一个产品中。
当我将它传输到另一个服务时,我将它存储在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.Multiple
和InstanceContextMode.Single
答案 0 :(得分:1)
扩展方法与其他任何方法相比都具有线程安全性。它们只是常规静态方法之上的语法糖。实际上,您可以调用与foo.GetID()
相同的方法,而不是FooExtensions.GetID(foo)
,而是执行相同的操作。这就是编译器真正为您做的事情。
根据您提供的示例,您的扩展方法是线程安全的。由于使用IsolationLevel.ReadUncommitted
,您的问题更有可能发生。 ReadUncommitted
可导致脏读,不可重复读,相同数据被读两次,以及幻像读。有关详细信息,请参阅this article。我建议提高你的隔离级别,看看是否会让你的问题消失。