winfrom 多线程调ACCESS数据库
我在一个项目开了三个线程,运行后这三个线程挂起,当从串口接到数据后判定数据类型然后恢复相应的线程,线程调用连接ACCESS数据操作,第一次正常,以后就不能 OPEN ACCESS连接,提示当前连接未关闭;我整个过程中恢复了这一个线程
下面是部分代码,请高手分析分析我触发的是 Lift_Init_Thread() 参数初始化线程 public static Thread ListMonitor_thread = new Thread(new ThreadStart(ListMonitor_Thread));//列表监控线程
public static Thread FaultDeal_thread = new Thread(new ThreadStart(FaultDeal_Thread));//故障数据处理线程
public static Thread Lift_Init_thread = new Thread(new ThreadStart(Lift_Init_Thread));//参数初始化线程 public static void Lift_Init_Thread()//参数初始化线程
{
string dat = "";
while (true)
{
dat = Lift_Init_Data;
if (dat != "")
{
string datS = "select count(*) from Lift_Init_Massages where lift='L1'";
datS = LinkToAccess.Link_base_reade_count(datS);
MessageBox.Show(datS);
}
Lift_Init_thread.Suspend(); //线程挂起
}
} public static void ListMonitor_Thread()//列表监控线程
{
string dat = "";
while (true)
{
dat = LMdata;
if (dat != oldLMdata && dat.Trim() != "")
{
;
}
ListMonitor_thread.Suspend(); //挂起线程
}
} public static void FaultDeal_Thread()//故障数据处理线程
{
string dat = "";
while (true)
{
dat = Fault_Data;
if (dat != "")
{
;
}
FaultDeal_thread.Suspend(); //挂起线程
}
} public static string Link_base_reade_count(string select)//数据读取
{
string back = "";
lock (back)
{
try
{
LINK.Open();//打开连接
OleDbCommand comd = new OleDbCommand(select, LINK);
back = comd.ExecuteScalar().ToString();
}
catch (Exception ee)//抛出异常
{
back = "连接失败\r\n" + ee;
}
finally
{
LINK.Close();
}
}
return back;
}
我在一个项目开了三个线程,运行后这三个线程挂起,当从串口接到数据后判定数据类型然后恢复相应的线程,线程调用连接ACCESS数据操作,第一次正常,以后就不能 OPEN ACCESS连接,提示当前连接未关闭;我整个过程中恢复了这一个线程
下面是部分代码,请高手分析分析我触发的是 Lift_Init_Thread() 参数初始化线程 public static Thread ListMonitor_thread = new Thread(new ThreadStart(ListMonitor_Thread));//列表监控线程
public static Thread FaultDeal_thread = new Thread(new ThreadStart(FaultDeal_Thread));//故障数据处理线程
public static Thread Lift_Init_thread = new Thread(new ThreadStart(Lift_Init_Thread));//参数初始化线程 public static void Lift_Init_Thread()//参数初始化线程
{
string dat = "";
while (true)
{
dat = Lift_Init_Data;
if (dat != "")
{
string datS = "select count(*) from Lift_Init_Massages where lift='L1'";
datS = LinkToAccess.Link_base_reade_count(datS);
MessageBox.Show(datS);
}
Lift_Init_thread.Suspend(); //线程挂起
}
} public static void ListMonitor_Thread()//列表监控线程
{
string dat = "";
while (true)
{
dat = LMdata;
if (dat != oldLMdata && dat.Trim() != "")
{
;
}
ListMonitor_thread.Suspend(); //挂起线程
}
} public static void FaultDeal_Thread()//故障数据处理线程
{
string dat = "";
while (true)
{
dat = Fault_Data;
if (dat != "")
{
;
}
FaultDeal_thread.Suspend(); //挂起线程
}
} public static string Link_base_reade_count(string select)//数据读取
{
string back = "";
lock (back)
{
try
{
LINK.Open();//打开连接
OleDbCommand comd = new OleDbCommand(select, LINK);
back = comd.ExecuteScalar().ToString();
}
catch (Exception ee)//抛出异常
{
back = "连接失败\r\n" + ee;
}
finally
{
LINK.Close();
}
}
return back;
}
ACCESS 不能同时有超过一个的连接,
线程要打开数据库时,必须关掉数据库,否则只有等待数据库被关闭
BeginInvoke操作
在一个时间段,只允许一个线程连接