【发布时间】:2012-08-13 14:51:48
【问题描述】:
由于代码重构而出现问题,在这种情况下最好的解决方案是什么?
问题在于 DbConnection 已从本地方法变量重构为类变量。 该应用程序是多线程的。 似乎问题在于 DbConnection 对象在它是成员变量时被共享。 什么是最好的解决方案?将其保留为本地方法变量?
public IDataReader Execute(CommandBehavior behavior, string[] parameterNames, object[] arguments)
{
DbConnection conn = null;
try
{
conn = Connection.CreateConnection();
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = StoredProcedureName;
cmd.CommandType = CommandType.StoredProcedure;
// ..................................................
// Perform the call.
return DataCachingContext.SetCachedData(call, cmd.ExecuteReader(behavior));
}
catch (Exception ex)
{
//..........................
}
finally
{
//
}
}
澄清一下,这里是导致问题的版本。存在运行时异常,索引到 ResultSets 的问题,这很可能是由于连接被覆盖。
DbConnection _conn = null;
public IDataReader Execute(CommandBehavior behavior, string[] parameterNames, object[] arguments)
{
try
{
_conn = Connection.CreateConnection();
DbCommand cmd = _conn.CreateCommand();
cmd.CommandText = StoredProcedureName;
cmd.CommandType = CommandType.StoredProcedure;
// ..................................................
// Perform the call.
return DataCachingContext.SetCachedData(call, cmd.ExecuteReader(behavior));
}
catch (Exception ex)
{
//..........................
}
finally
{
//
}
}
经过更多调查,看起来 DbConnection 变量已成为类变量以启用单元测试。当它是局部变量时,无法测试它的值。正在测试 DbConnection 的状态
【问题讨论】:
-
最好的方法是研究thread-safety 和multithreading。这个问题已经在这里被问了数百次了; 今天可能已经被问过了。
-
我在这里没有看到任何问题,只是您声明 DbConnection 是一个类变量,而这里它显然是一个局部变量,您是否声明了两次?如果这不是问题,我们需要更多细节。
-
我在您的代码中没有看到任何线程。
DataCachingContext是共享对象吗?是static吗? -
您通常不会使变量线程安全。您可以访问它线程安全在特定情况下。这已经暗示了解决方案:不要以跨线程方式访问变量,如果可以避免的话(通常是这样)。这是最安全的方法。
-
如果您可以更具体地了解您遇到的问题,您将获得更好的答案。乍一看,您似乎不会遇到您使用发布的特定代码描述的问题,并且您没有说明您是否收到错误消息或错误消息的内容。
标签: c# .net multithreading thread-safety