OPC SERVER运行一段时间后异常退出,求指教

我用.NET开发了一个OPC SERVER,开启后可以正常运行,但是运行一段时间后莫名弹出这个窗口后,程序停止了。在程序中各阶段捕获异常都没能捕获到。
主要更新数据的逻辑如下:
ThreadPool.SetMinThreads(4, 4); // 工作线程和I/O线程的最小值
ThreadPool.SetMaxThreads(20, 20); // 工作线程和I/O线程的最大值
List<string> tag_list = new List<string>();
int count = 0;
try
{
foreach (string tag in tags)
{
tag_list.Add(tag);
count++;
if (tag_list.Count == 10 || count == tags.Count)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(this.UpdateValue), new List<string>(tag_list));
tag_list.Clear();
}
}
}catch(Exception ex)
{
TxtLog.WriteTextLog("程序异常:" + ex.Message + ex.StackTrace, DateTime.Now, "主任务异常");
}
private void UpdateValue(object obj)
{
try
{
List<string> tags = obj as List<string>;
string tagName = string.Empty;
string sqlPiStr = string.Empty;
PiData pid = new PiData();
DataTable piDt = new DataTable();
double value = 0;
int itemHandle = 0;
string dataType = string.Empty;
string tagNames = "";//常位号
string kgTagNames = "";//开关位号
foreach (string tag in tags)
{
if (tag.Split('$').Length != 2)
{
TxtLog.WriteTextLog(tag + "位号设置异常", System.DateTime.Now, "位号设置异常");
continue;
}
dataType = tag.Split('$')[0];
tagName = tag.Split('$')[1];
if (dataType.ToUpper() == "DOUBLE" || dataType.ToUpper() == "FLOAT" || dataType.ToUpper() == "INT"
|| dataType.ToUpper() == "SHORT" || dataType.ToUpper() == "USHORT"||dataType.ToUpper() == "BYTE")
{
//数值位号
tagNames += "'" + tagName + "',";
}
else
{
//bool类型待定
continue;
}
}
if (tagNames.Length > 0)
{
tagNames = tagNames.Remove(tagNames.Length - 1, 1);
sqlPiStr = string.Format(@"select tag,value,time from [piarchive]..[picomp] where " +
" tag in ({0}) and time ='*'", tagNames);
try
{
piDt.Clear();
piDt = pid.rdtable(sqlPiStr);
}
catch (Exception ex)
{
TxtLog.WriteTextLog("数据读取失败," + ex.Message + ex.StackTrace + "\r\nsql=" + sqlPiStr, System.DateTime.Now, "实时数据采集异常");
return;
}
for (int i = 0; i < piDt.Rows.Count; i++)
{
if (double.TryParse(piDt.Rows[i]["value"].ToString(), out value))
{
tagName = piDt.Rows[i]["tag"].ToString();
//获取句柄
if (tagName_ItemHandle.TryGetValue(tagName, out itemHandle))
{
try
{
ServerOpc.UpdateOPCItem(itemHandle, value);
}
catch (Exception ex)
{
TxtLog.WriteTextLog(tagName + "-" + value + "-数据更新异常,erro=" + ex.Message + "\n" + ex.StackTrace, System.DateTime.Now, "更新数据异常");
}
}
}
else if (piDt.Rows[i]["value"] != null && piDt.Rows[i]["value"].ToString().Trim() != "")
{
tagName = piDt.Rows[i]["tag"].ToString();
//获取句柄
if (tagName_ItemHandle.TryGetValue(tagName, out itemHandle))
{
try
{
ServerOpc.UpdateOPCItem(itemHandle, piDt.Rows[i]["value"].ToString().Trim());
}
catch (Exception ex)
{
TxtLog.WriteTextLog(tagName + "-" + value + "-数据更新异常,erro=" + ex.Message + "\n" + ex.StackTrace, System.DateTime.Now, "更新数据异常");
}
}
}
else
{
TxtLog.WriteTextLog("更新数据失败,没有取到值(" + piDt.Rows[i]["value"].ToString() + "),sql=" + sqlPiStr + "\r\n", System.DateTime.Now, "更新数据失败");
}
//break;
}
}
if (kgTagNames.Length > 0)
{
kgTagNames = kgTagNames.Remove(kgTagNames.Length - 1, 1);
sqlPiStr = string.Format(@"SELECT tag, time,DIGSTRING(status) value
FROM piarchive..picomp WHERE tag in ({0}) AND time = '*'", kgTagNames);
try
{
piDt.Clear();
piDt = pid.rdtable(sqlPiStr);
}
catch (Exception ex)
{
TxtLog.WriteTextLog("实时数据读取失败," + ex.Message + ex.StackTrace + "\r\nsql=" + sqlPiStr, System.DateTime.Now, "实时数据采集异常");
return;
}
for (int i = 0; i < piDt.Rows.Count; i++)
{
if (piDt.Rows[i]["value"].ToString().Trim().ToUpper() == "OFF")
{
tagName = piDt.Rows[i]["tag"].ToString();
//获取句柄
if (tagName_ItemHandle.TryGetValue(tagName, out itemHandle))
{
try
{
ServerOpc.UpdateOPCItem(itemHandle, 0);
}
catch (Exception ex)
{
TxtLog.WriteTextLog(tagName + "-" + piDt.Rows[i]["value"].ToString() + "-数据更新异常,erro=" + ex.Message + "\n" + ex.StackTrace, System.DateTime.Now, "更新数据异常");
}
}
}
else if (piDt.Rows[i]["value"].ToString().Trim().ToUpper() == "ON")
{
tagName = piDt.Rows[i]["tag"].ToString();
//获取句柄
if (tagName_ItemHandle.TryGetValue(tagName, out itemHandle))
{
try
{
ServerOpc.UpdateOPCItem(itemHandle, 1);
}
catch (Exception ex)
{
TxtLog.WriteTextLog(tagName + "-" + piDt.Rows[i]["value"].ToString() + "-数据更新异常,erro=" + ex.Message + "\n" + ex.StackTrace, System.DateTime.Now, "更新数据异常");
}
}
}
else
{
///更新数据失败,没有取到值
//TxtLog.WriteTextLog("更新数据失败,没有取到值(" + piDt.Rows[i]["value"].ToString() + "),sql=" + sqlPiStr + "\r\n", System.DateTime.Now, "更新开关量数据失败");
}
}
}
}
catch(Exception ex)
{
TxtLog.WriteTextLog("程序异常:" + ex.Message + ex.StackTrace, DateTime.Now, "更新任务异常");
}
}