我在我的应用多线程中使用来访问一个静态连接
我看到一些关于lock
语句的例子,但是一段时间之后应用程序会传播
cross thread exception所以我写了一个以我自己的方式管理流程的代码,但我想知道这是一个很好的实践 或者坏,并将导致未来的例外,我测试它和它的工作正常。
here is the example:
public static DataTable ExecuteCommand(SqlCommand cmd)
{
_dt = new DataTable();
cmd.Connection = Cn;
_da = new SqlDataAdapter(cmd);
int tryTimes = 0;
try
{
lock (Cn)
{
while (true)
{
if (Cn.State == ConnectionState.Open)
{
tryTimes++;
if (tryTimes == 10)
break;
Thread.Sleep(200);
}
else if (Cn.State == ConnectionState.Closed)
{
Cn.Open();
_da.Fill(_dt);
Cn.Close();
break;
}
}
}
}
catch (Exception ex)
{
if (Cn.State == ConnectionState.Open)
Cn.Close();
System.Diagnostics.EventLog.WriteEntry(ex.Source,ex.Message, System.Diagnostics.EventLogEntryType.Error);
}
return _dt;
}
此代码收到准备好的命令,并引用连接Cn
给它,但之前
打开连接并避免交叉线程异常确保在打开连接状态之前关闭连接状态。
如果连接状态打开,它会继续尝试10次并且每次尝试等待200毫秒,如果连接状态保持打开,经过10次以避免无限循环,它会打破循环。